如何为主键约束命名?

时间:2011-08-18 14:10:49

标签: sql sql-server-2005 sql-server-2008 indexing

我有关于索引的(另一个)问题。

我使用以下代码:

CREATE TABLE [dbo].[PnrDetails1](
        [OId] [int] IDENTITY(1,1) NOT NULL ,
    [file_name] [varchar](256) NOT NULL,
    [gds_id] [int] NOT NULL,
    [pnr_locator] [varchar](15) NOT NULL,
    [first_cust_name] [varchar](50) NOT NULL,
    [ticket_number] [varchar](20) NOT NULL,
    [full_price] [decimal](18, 0) NOT NULL,
    [currency_desc] [varchar](4) NOT NULL,
    [user_name] [varchar](50) NOT NULL,
    [save_time] [datetime] NOT NULL,
    [update_time] [datetime] NOT NULL,
    [clerk_id] [int] NOT NULL,
    [isUpdated] [bit] NOT NULL,
    [isDeleted] [bit] NOT NULL,
    [pnr_file_id] [int] NOT NULL
) ON [PRIMARY]

ALTER TABLE [dbo].[PnrDetails1] ADD PRIMARY KEY CLUSTERED 
(
[OId] ASC
)ON [PRIMARY]

这实际上是为我创建的脚本sql server 2008, 但是当我查看对象资源管理器时,我看到了一个丑陋的索引名称(类似于PK_ PnrDetai _CB394B1958F2C25C)。我该怎么改变它?如果是的话?

3 个答案:

答案 0 :(得分:4)

虽然我同意@marc_s你应该总是预先声明这些名字,但我不同意你必须放弃并重新创建:

EXEC sp_rename 'PK_PnrDetai_CB394B1958F2C25C', 'my_new_shiny_name', OBJECT;

答案 1 :(得分:3)

你可以(并且你应该)明确地给你的主键约束命名:

ALTER TABLE [dbo].[PnrDetails1] 
ADD CONSTRAINT PK_PnrDetails1
PRIMARY KEY CLUSTERED([OId] ASC) ON [PRIMARY]

您只能在创建时执行此操作 - 因此,在您的情况下,您可能必须先删除它,然后使用正确,可读的名称重新创建它。

答案 2 :(得分:0)

或者使用这个:

DECLARE @new_pk_name VARCHAR(MAX)='pk_new_name' --here set new name of primary key
DECLARE @table VARCHAR(MAX)='dbo.table_name' --here set name of the table
DECLARE @old_pk_name VARCHAR(MAX)
SELECT
    @old_pk_name=name
    FROM sys.key_constraints
    WHERE [type] = 'PK'
    AND [parent_object_id] = OBJECT_ID(@table);
SET @old_pk_name=@table+'.'+@old_pk_name;
EXEC sp_rename @old_pk_name, @new_pk_name;
GO