我将 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 号。
您的目标应该可以通过表之间的外键约束更简单地实现。
如果在/表和表之间创建外键,则可以按照 Microsoft BOL for Primary and Foreign Key Constraints - Cascading Referential Integrity中指定的操作来指定操作。
Purchases
Sales
Transactions
ON DELETE
NO ACTION
当子表中有外键
NO ACTION
关联的记录时,会阻止DELETE
s 在父表上出现:实际上,
NO ACTION
是默认值,因此仅声明外键而不指定ON DELETE
子句就足以防止父行在已被引用的情况下被删除。我找到了解决这个问题的两种方法。
第一种传统方法是在删除购买或销售条目之前,我将检查相应的 BillID 或 InvID 是否存在于 Transaction Table AgainstBillId 列中,如果存在则将取消删除步骤。
第二种方法就像我所说的那样,我在数据库中创建了 1 个视图,其中UNION的BillID 和 InvID 都有,所以我将有一个包含采购和销售表中所有 ID 的单列,现在数据库中的视图不支持创建外键所以将它添加到支持它的 Visual Studio 中的数据集设计器中。