sql-server – 灵活的外键
发布时间:2021-02-24 10:45:51 所属栏目:MsSql教程 来源:网络整理
导读:我有一个SQL Server数据库.我正在开发一个vb.net应用程序. 现在我想要一个“事件”表,它应该保留与我的数据库相关的所有事件.但是,此表的其中一个字段应该是与此事件必须执行的记录相关的字段ObjectID.但是这个记录可能在不同的表格上.例如 : 事件1 —-在表
我有一个SQL Server数据库.我正在开发一个vb.net应用程序. 现在我想要一个“事件”表,它应该保留与我的数据库相关的所有事件.但是,此表的其中一个字段应该是与此事件必须执行的记录相关的字段ObjectID.但是这个记录可能在不同的表格上.例如 : >事件1 —-在表客户端上记录25 问题是这个字段ObjectID应该是一个灵活的外键,因为可能与不同的表有关. 有什么办法可以解决这个案子吗? 谢谢 ! 解决方法解决这个问题的一种方法是在数据库中添加一个表,使其像其他表的基础一样,并与其他表建立一对一的关系,然后将事件表连接到此基表.这将允许您保持每个表的数据完整性. 基表可以像一列一样简单,也可以有所有其他表共有的列,从而在数据结构中实现一种“继承”. 创建基表(假设其他表之间没有公共列): CREATE TABLE TblObjectBase ( ObjectBase_Id int IDENTITY(1,1) PRIMARY KEY ) 然后,对于需要由Events表中的ObjectId引用的任何其他表: CREATE TABLE TblClients ( Client_Id int PRIMARY KEY,Client_FirstName varchar(10),Client_LastName varchar(10),-- Other client related data CONSTRAINT FK_TblClients_TblObjectBase FOREIGN KEY(Client_Id) REFERENCES TblObjectBase(ObjectBase_Id) ) CREATE TABLE TblInvoices ( Invoice_Id int PRIMARY KEY,-- other incoice related data CONSTRAINT FK_TblInvoices_TblObjectBase FOREIGN KEY(Invoice_Id) REFERENCES TblObjectBase(ObjectBase_Id) ) 剩下的唯一事情是为TblObjectBase插入一个新值,用于其他表上的任何插入.这可以通过存储过程或插入触发器轻松实现. CREATE PROCEDURE Insert_TblClients ( @Client_FirstName varchar(10),@Client_LastName varchar(10),-- any other client related data you might have ) AS DECLARE @ClientId int -- Insert a new record to the base table: INSERT INTO TblObjectBase DEFAULT VALUES; -- Get the id you've just inserted: SELECT @ClientId = SCOPE_IDENTITY(); -- Insert the data to the clients table: INSERT INTO TblClients (Client_Id,Client_FirstName,Client_LastName.....) VALUES (@ClientId,@Client_FirstName,@Client_LastName...) 而不是插入触发器将如下所示: CREATE TRIGGER TblClients_IO_Insert ON TblClients INSTEAD OF INSERT AS BEGIN DECLARE @ClientId int -- Insert a new record to the base table: INSERT INTO TblObjectBase DEFAULT VALUES; -- Get the id you've just inserted: SELECT @ClientId = SCOPE_IDENTITY(); INSERT INTO TblClients (Client_Id,Client_LastName.....) SELECT @ClientId,Client_LastName..... FROM inserted END 如果您选择使用而不是插入,Identity值来自另一个表的事实应该对客户端(您的vb.net程序)透明. (编辑:通辽站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |