2013-01-02 160 views
1

我有一個與外鍵相關的問題。我使用SQL Server 2008的SQL外鍵刪除問題

有2個表,客戶和發票,他們是這樣的:

Customer表:
客戶ID
名稱
地址

發票表:
InvoiceID
日期
CustomerID

Customer表中的CustomerID列是主鍵,並且Invoice表中的CustomerID列具有外鍵。

我想刪除Customer表中的一行,但沒有刪除Invoice表中的連接行。有沒有辦法做到這一點?

編輯:
我忘了提,被刪除的客戶被存儲在日誌表,所以ID仍然存在,但在不同的表

+5

您想故意創建數據完整性問題嗎?當客戶不在時,customerID 53在發票表中有什麼含義? – Randy

+1

就刪除了,你應該可以將FK值級聯爲null。 – Randy

+1

只需將客戶標記爲不活動。你仍然需要記錄。 – Ben

回答

6

「我要刪除行,但不刪除 「發票」表中的已連接行。「

外鍵的整個和整個點是阻止你這樣做。

該約束強制執行規定發票必須屬於客戶的規則。那麼,如果發票不屬於客戶,那麼在您的應用程序中意味着什麼?它應該歸屬於什麼?

或者把它放在商業條款中,如果一張發票沒有一個客戶誰付款?


copurse,我的咆哮假定Invoice.CustomnerID是一個強制性的列。也許你的數據模型允許它是可選的。在這種情況下,將列設置爲NULL,然後您可以刪除客戶記錄。鑑於基本的業務規則 - 發票必須支付(或公司破產)我認爲這將是一個有缺陷的數據模型,但嘿!

+1

除此之外(很可能是因爲),ERP系統中很常見的是禁用 - 標記客戶表條目(意味着客戶不再活動,並且由於歷史原因只保留在數據庫中) – Najzero

+0

您是對的,但我忘記提及已刪除的客戶正在存儲在日誌表中,因此該ID仍然存在,但在另一個表中,是否有另一個解決方案? – Marc

+2

@Marc - 爲什麼單獨的表格而不是'is_deleted'標誌或'deleted_date'?您可以通過過濾來顯示活躍的客戶。 –

0

像這樣從SQL Management Studio中調整你的FK約束。突出顯示的刪除規則概括了你希望在相關表記錄上隱含什麼類型的強制執行,我看到的approprite選項可以是下拉菜單中的設置默認值或設置空值。請考慮附上的圖片。

enter image description here