加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 灵活的外键

发布时间:2021-02-23 05:45:16 所属栏目:MsSql教程 来源:网络整理
导读:我有一个SQL Server数据库.我正在开发一个vb.net应用程序. 现在我想要一个“事件”表,它应该保留与我的数据库相关的所有事件.但是,此表的其中一个字段应该是与此事件必须执行的记录相关的字段ObjectID.但是这个记录可能在不同的表格上.例如 : 事件1 —-在表

我有一个SQL Server数据库.我正在开发一个vb.net应用程序.

现在我想要一个“事件”表,它应该保留与我的数据库相关的所有事件.但是,此表的其中一个字段应该是与此事件必须执行的记录相关的字段ObjectID.但是这个记录可能在不同的表格上.例如 :

>事件1 —-在表客户端上记录25
>事件2 —-记录30张表发票
>活动3 —-记录40篇文章

问题是这个字段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程序)透明.

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读