2011-08-18 46 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'重命名現有的約束 - 謝謝你展示瞭如何做到這一點! –