2010-05-12 66 views
3

假設一個如何更新在另一個表中引用爲外鍵的表的主鍵?

Table "Person" having 
    "SSN", 
    "Name", 
    "Address" 

和另一

Table "Contacts" having 
    "Contact_ID", 
    "Contact_Type", 
    "SSN" (primary key of Person) 

同樣

Table "Records" having 
    "Record_ID", 
    "Record_Type", 
    "SSN" (primary key of Person) 

現在我想,當我改變或親自表中相應的變化在其他2個表更新SSN。

  1. 如果有人可以幫助我爲
  2. 或者如何觸發通過外鍵約束表

回答

8

只是UPDATE CASCADE添加到外鍵約束。

1

那麼,假設SSN是Person表的主鍵,我只想(當然,在一個交易):

  • 創建一個全新的行新SSN,複製所有其他細節舊的一排。
  • 更新其他表中的列以指向新行。
  • 刪除舊的行。

現在,這實際上是一個很好的例子,說明爲什麼您不應將實際數據用作表交叉引用(如果數據可能更改)。如果你使用了一個人造的柱子將它們綁在一起(並且只將SSN存儲在一個地方),你就不會有問題。

5

最好不要改變表的主鍵。如果您希望SSN發生變化,您應該使用不同的主鍵,並將SSN作爲人員表中的正常數據列。如果進行此更改已經太遲了,可以將ON UPDATE CASCADE添加到外鍵約束。

+1

+1提及一個主鍵不應該代表任何業務細節,並提供一個替代方案的提問者。 – 2010-05-12 12:37:05

4

如果您的PK有變化,您需要查看錶格設計,使用代理PK,如身份。

在你的問題你有一個Person表,這可能是許多表的FK。在這種情況下,ON UPDATE CASCADE可能會有一些嚴重的問題。我正在處理的數據庫有超過300個參考文獻(FK),我們跟蹤每個人在每個不同表格中執行的各種工作。如果我在Person表中插入一行然後嘗試再次刪除它(它不會用於任何其他表中,則它是新的),刪除將失敗,結果爲Msg 8621, Level 17, State 2, Line 1 The query processor ran out of stack space during query optimization. Please simplify the query.因此,我無法想象ON UPDATE CASCADE當你在PK上獲得許多FK時會起作用。

我絕不會像SSN那樣使敏感數據成爲PK。醫療保健公司曾經這樣做過,並且因爲隱私而進行了痛苦的轉換。我希望你沒有一個網絡應用程序,並有一個名爲SSN的GET或POST變量,其中的實際值!或者在每個報告上顯示SSN,或者是否將所有舊的打印報告撕碎,並限制誰查看每個報告。

+0

SSN(加拿大SIN)是一個非常糟糕的PK,因爲他們實際上可以相對於個人的變化,除了它不是一個給定的,每個人都將在事實上有一個。 – 2010-05-12 13:54:59

+1

我認爲可以肯定地說,你永遠不應該使用用戶輸入作爲主鍵。 – dotjoe 2010-05-12 15:38:57

+0

是的,我沒有使用它作爲主鍵。但在這種情況下,我不得不問這樣的事情,它不是在我的studd中的PK :) – Mobin 2010-05-14 13:16:23

1

級聯更新和刪除使用非常危險。如果您有一百萬條兒童記錄,則最終可能會出現嚴重的鎖定問題。您應該代碼更新和刪除。

如果可以避免,你絕對不應該使用具有改變潛力的PK。你也不應該使用SSN作爲PK,因爲它永遠不應該在數據庫中未加密存儲。從來沒有,除非你的公司喜歡被起訴,當他們是一個契約盜竊事件的原因。這不是一個設計缺陷,因爲這是遺留下來的,我們沒有時間去解決。這是一個設計缺陷,可能破產公司,如果有人偷了你的備份磁帶或獲取核潛艇出以另一種方式的系統正(大多數這類盜竊的是內部BTW)的。這是一個迫切 - 必須修復現在的設計缺陷。

SSN也是一個糟糕的選擇,因爲它改變了(人們改變他們時,他們是身份盜竊例如受害者。)加上整數PK將有超過九位數的PK更快的性能。

相關問題