2012-10-01 129 views
4

我試圖用丟棄從表中的主鍵約束下SQL Server 2008中無法刪除約束

ALTER TABLE SchemaName.LabourGrade DROP CONSTRAINT Labour_Grade_pk 

,並得到錯誤Labour_Grade_pk is not a constraint.

當我做

SELECT * FROM sysobjects WHERE name = 'LabourGrade_pk'

我得到一行。它確實有FK,所以我試着放棄那些第一但同樣的問題。 我只想放棄PK以改變列的數據類型,有沒有更好的方法來做到這一點?

+0

你是從哪裏改變數據類型?你並不總是必須放棄PK。 –

+0

其當前varchar(2),它需要是varchar(3)。當我試圖改變列時,我得到了一個關於對象LabourGrade_pk依賴於列代碼的錯誤 – Nix

+3

其中一個名稱有兩個下劃線,另一個有一個下劃線。在你的問題,或實際問題的錯字? –

回答

3

我只想放棄PK以改變列的數據類型,有沒有更好的方法來做到這一點?

是的,你根本不需要刪除並重新創建PK(和相關的索引)。您可以通過ALTER TABLE ... ALTER COLUMN將其作爲簡單的元數據更改來完成。

CREATE TABLE #T 
(
P VARCHAR(2) PRIMARY KEY 
)  

INSERT INTO #T VALUES ('AA') 

ALTER TABLE #T ALTER COLUMN P VARCHAR(3) NOT NULL 

DROP TABLE #T 
+0

我試着這樣做,但得到一個關於PK的錯誤取決於列 – Nix

+0

@Nix - 請確保您指定了「NOT NULL」。否則,你會得到錯誤'The object'PK __#T________3BD019BD4CA06362'依賴於列'P'... ALTER TABLE ALTER COLUMN P失敗,因爲一個或多個對象訪問該列。' –

+0

有幾個FK關係引用該表的PK所以我試圖首先改變它們,包括不爲null,仍然讓對象依賴於列錯誤。 – Nix

4

如果SELECT * FROM sysobjects WHERE name = 'LabourGrade_pk'返回一個排,那麼你要使用:

ALTER TABLE SchemaName.LabourGrade DROP CONSTRAINT LabourGrade_pk 

ALTER TABLE SchemaName.LabourGrade DROP CONSTRAINT Labour_Grade_pk 
                 --^-- We don't want this 

但是,爲什麼你需要取消該約束這並沒有解決,根據其他評論和@ Martin的回答。