Sql-Server

為什麼更改表並添加外鍵會創建額外的約束?

  • December 22, 2013

編輯:這是一個預設約束,因為在添加列時設置了預設值。這個名字在以“DF__”開頭時就洩露了。無論如何,通過添加列並手動命名約束來解決它。

ALTER TABLE MyTable ADD [FooId] [int] NOT NULL CONSTRAINT DF_MyTable_FooId DEFAULT 0

現在我可以輕鬆地刪除約束並刪除列。


出於測試目的,我需要經常刪除並重新創建一些表。我正在使用 MS-Sql 伺服器 2008 r2。

當我創建表時,我還在現有表(我不能直接刪除的表)中創建一個外鍵:

ALTER TABLE MyTable
ADD CONSTRAINT FK_MyTable_NewTable
FOREIGN KEY (FooId) REFERENCES NewTable (Id)

這確實正確地創建了外鍵,但它還添加了一個帶有系統生成名稱的約束(類似於 DF__MyTable_FooId__53385258),如果在 CREATE TABLE 語句中定義了外鍵,則不會創建該約束。

我的問題是,當我想刪除 MyTable 時,我必須刪除外鍵約束——這很容易,因為我命名了它,但是另一個系統生成的約束仍然存在,我沒有直接的刪除方法它。

是否可以在系統不生成第二個(我假設是多餘的)約束的情況下將外鍵添加到現有表中?

我能想到像您這樣的 DDL 語句可能會導致“額外”約束的唯一方法是當有一個 DDL 觸發器創建該約束以響應您的 DDL 語句時。如果您的數據庫不是這種情況,那麼上述額外約束肯定是完全不同的語句與創建外鍵的語句無關的結果。

它可能出現在更早的階段(例如,在創建表時),或者它可能是由在與您的文章中的腳本在同一腳本中執行的語句添加的,並且由於某種原因該事實沒有註冊當時和你在一起。

引用自:https://dba.stackexchange.com/questions/21678