2011-08-18 167 views
1

我有(另一个)关于索引的问题。我如何给主键约束命名?

我使用下面的代码:

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)。我该如何改变它?如果是这样?

+0

我想你可能已经接受了错误的答案。问题是,“如何更改已存在的主键约束的名称?”,而不是“我如何给一个尚不存在的主键约束命名?”,对吗?虽然@marc_s给出的答案确实包含了解决方法,但他给出的脚本假定约束不存在。一位评论者甚至指出,丢弃/重新创建可能会非常昂贵,特别是如果它完成了所有操作,都会改变名称。应该清楚,更好的答案是只有在可能的情况下才会更改元数据。 –

回答

3

可以(和你应该)显式地指定一个名称到您的主键约束:

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

你只能做到这一点,在创作的时候 - 所以你的情况,你可能要先放下它,然后用适当的可读名称重新创建它。

+0

检查亚伦的答案,如何做到这一点没有下降,并重新创建(这可以是一个非常昂贵的操作) –

4

虽然我@marc_s,你应该总是在前面,我不同意,你必须删除并声明这些名字同意重新制作:

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

+1 ahhh - 你的许多好点的又一个! :-)我不知道你也可以用'sp_rename'重命名现有的约束 - 谢谢你展示了如何做到这一点! –