I SQL Server kan du använda sp_rename
lagrad procedur för att byta namn på ett användarskapat objekt i den aktuella databasen, inklusive en primärnyckel.
Detta kan vara praktiskt om du har en primärnyckel som fick sitt namn automatiskt och du nu vill ge den ett mer läsbart namn.
När du skapar en primärnyckel utan att uttryckligen ange ett namn för den, delegerar SQL Server automatiskt ett namn för den. Sådana namn innehåller vanligtvis ett långt numeriskt suffix, vilket gör det svårare att komma ihåg. Om du behöver hänvisa till den primära nyckeln (t.ex. i din kod, dokumentation, etc), kan sådana namn göra ditt liv svårare. Lyckligtvis, sp_rename
ger ett snabbt och enkelt sätt att ändra detta namn.
Syntax
Syntaxen för sp_rename
går så här:
sp_rename
[ @objname = ] 'object_name' ,
[ @newname = ] 'new_name'
[ , [ @objtype = ] 'object_type' ]
För primärnycklar (och andra begränsningar) är objekttypen OBJECT
.
Exempel
Låt oss först få namnet på den primära nyckeln som vi vill ändra:
SELECT
SCHEMA_NAME(schema_id) AS SchemaName,
name AS PrimaryKey
FROM sys.objects
WHERE parent_object_id = (OBJECT_ID('dbo.t1'))
AND type = 'PK';
Resultat:
+--------------+--------------------------+ | SchemaName | PrimaryKey | |--------------+--------------------------| | dbo | PK__t1__3213663B10938530 | +--------------+--------------------------+
Detta är den primära nyckeln för tabellen som heter t1
, Så vi går vidare och byter namn på den primärnyckeln.
När du byter namn på en primärnyckel måste du inkludera schemat med det aktuella namnet.
Exempel:
EXEC sp_rename 'dbo.PK__t1__3213663B10938530', 'PK_t1';
När du byter namn på en primärnyckel (eller något annat objekt) i SQL Server, kommer du förmodligen att se följande meddelande:
Caution: Changing any part of an object name could break scripts and stored procedures.
Detta ger oss i grunden insikten om att alla skript och/eller lagrade procedurer som refererar till objektet nu kan gå sönder, och bör uppdateras i enlighet med det för att återspegla det nya namnet.
Oavsett vilket har primärnyckeln nu bytt namn.
Vi kan verifiera detta genom att köra den föregående frågan igen:
SELECT
SCHEMA_NAME(schema_id) AS SchemaName,
name AS PrimaryKey
FROM sys.objects
WHERE parent_object_id = (OBJECT_ID('dbo.t1'))
AND type = 'PK';
Resultat:
+--------------+--------------+ | SchemaName | PrimaryKey | |--------------+--------------| | dbo | PK_t1 | +--------------+--------------+
Inklusive objekttypen
Du kan också inkludera objekttypen som ett tredje argument. För primärnycklar och andra begränsningar, använd OBJECT
:
EXEC sp_rename 'dbo.PK__t1__3213663B10938530', 'PK_t1', 'OBJECT';
Inklusive parameternamnen
Som med alla lagrade förfaranden kan du även inkludera parameternamnen när du anropar sp_rename
:
EXEC sp_rename
@objname = 'dbo.PK__t1__3213663B10938530',
@newname = 'PK_t1',
@objtype = 'OBJECT';
Detta gör exakt samma sak (byter namn på den angivna primärnyckeln).