Sql-Server

想要設置 3 個表之間的關係(第一個子表列值取決於另外兩個表列之間)

  • June 10, 2021

我將 Visual Basic 與 Microsoft SQL Server 數據庫一起用於我的 WinForms 應用程序。

我有 3 張桌子 - 購買、銷售、交易(用於付款/收據)

在 Transactions 表中,我使用 Purchase Table 的 RowId 或 Sales Table 的 RowId 作為參考來確定付款屬於哪個購買/銷售記錄。

現在在 Transaction 表中輸入記錄後,如果 Transactions 表記錄中使用了 RowId,我不想讓Delete Purchase/Sale 條目。

我嘗試過的是採購和銷售表的行 ID 都是唯一值,因此創建了 1 個名為 PurchaseSaleIds 的視圖,其中兩個表的聯合值,現在我將 PurchaseSaleIds 作為主鍵表(視圖)和事務作為外鍵表,但它不是SQL Server 允許在視圖和表之間設置外鍵關係。

Table Purchases 有 BillID 主鍵列,Table Invoices 有 InvID 主鍵列,在 Transaction 表下我有 AgainstBillId 列,它將儲存 BillID 或 InvID 之間的 ID 號。

我找到了解決這個問題的兩種方法。

第一種傳統方式是在刪除購買或銷售條目之前,我將檢查相應的 BillID 或 InvID 是否存在於 Transaction Table AgainstBillId 列中,如果存在則將取消刪除步驟。

第二種方法就像我所說的那樣,我在數據庫中創建了 1 個視圖,其中****UNIONBillID 和 InvID 都有,所以我將有一個包含採購和銷售表中所有 ID 的單列,現在數據庫中的視圖不支持創建外鍵所以將它添加到支持它的 Visual Studio 中的數據集設計器中。

您的目標應該可以通過表之間的外鍵約束更簡單地實現。

如果在/表和表之間創建外鍵,則可以按照 Microsoft BOL for Primary and Foreign Key Constraints - Cascading Referential Integrity中指定的操作來指定操作。Purchases``Sales``Transactions``ON DELETE``NO ACTION

當子表中有外鍵NO ACTION關聯的記錄時,會阻止DELETEs 在父表上出現:

數據庫引擎引發錯誤,並且對父表中的行執行的刪除或更新操作被回滾。

實際上,NO ACTION這是預設值,因此僅聲明外鍵而不指定ON DELETE子句就足以防止父行在已被引用的情況下被刪除。

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