2012-01-30 90 views
2

我有一個表tableA,它有一個列myID。 myID是tableA中的主鍵和tableB的外鍵。如何更新主鍵如果它也是另一個表的外鍵?

當我試圖TableA中更新特定記錄的身份識別碼:

update tableA 
set myID = 123456 
where myID= 999999 

我得到這個錯誤:

The UPDATE statement conflicted with the FOREIGN KEY constraint "tableA_FK00". The conflict occurred in database "mydatabase" , table "tableA" , column 'myID'.

我已經設置身份識別碼的更新規則爲「級聯」和強制執行外鍵約束到'不',但我仍然無法更新。我應該如何繼續?

+1

你爲什麼需要更新你的PK?似乎這裏有些事情沒有做好。 – 2012-01-30 04:47:54

+0

檢查此帖:http://stackoverflow.com/questions/799100/changing-a-record-in-a-table-sql-server-that-has-foreign-keys – NoChance 2012-01-30 04:56:07

+0

在級聯更新規則的存在下,任何更改/主鍵的更新會反映到外鍵。在這種情況下,您不必禁用外鍵約束。 – 2012-01-30 05:45:55

回答

0

請嘗試以下步驟:

  • 禁用FK約束暫時(ALTER TABLE tableA WITH NOCHECK CONSTRAINT ALL)。
  • 更新您的主鍵
  • 更新您的外鍵相匹配的主鍵更改
  • 啓用反向執行FK約束
0

如果有TableB中記錄引用表A與PK 123456 tableB的是帶有「tableA_FK00」約束的表,那麼你違反了約束。如果你必須改變tableA中一行的PK(並且我不確定你爲什麼要這樣做,那麼PK的決不應該改變!!!)你有責任確保沒有其他記錄用FK約束來引用它。

所以,如果你堅持在TableA的改變PK:

  1. 查找該表有約束 「tableA_FK00」(確保它是唯一tableB的see post here)。
  2. 暫時移除約束TableB中
  3. 更新TABLEA
  4. 更新TableB中需要他們的FK tableB的
  5. 改變
  6. 再塗FK約束

另一種選擇的所有行:

  1. 將FK 123456中來自tableB的所有行的id插入臨時表(該表只包含來自tableB的PK的鍵)
  2. 設置tableB的FK字段允許空值
  3. 設置TableB中FK各個領域= NULL通過tableB的PK
  4. 變化通過參加行表A
  5. 將所有的TableB中的行以999999與臨時表加盟與臨時表。
相關問題