SQL Server参照完整性添加行父表

时间:2014-02-25 21:21:56

标签: c# sql-server

我有一个父表

ptable (pid int, name varchar(10)); where pid is the primary key

Child table ctable (pid int, cid int, cname varchar(10)); where pid references ptable.

ptable只有2行

pid   name
1     Sales
2     Marketing

使用C#应用程序我从文本文件中将行插入ctable。如果违反参照完整性,我希望能够在ptable中创建一行。可以这样做吗?

2 个答案:

答案 0 :(得分:2)

如前所述,这可以通过触发器或其他方式完成。你说你是通过文本文件这样做的。我能够做到这一点的唯一方法是将文本文件导入临时表,并验证包括父/子完整性规则的数据。在进行子插入之前,一个简单的“选择计数(id)作为总计来自ptable,其中pid:= pid”会告诉您父记录是否存在。然后,您可以为父表执行一次插入,然后为子项执行插入(如果不存在),或者如果父项存在,则可以直接插入子记录。

如果没有为初始插入找到父记录而第二个字段临时存储唯一ID,则某些系统会使用虚拟父记录。然后创建缺少的父记录并更新子记录。然后将子表更新为类似于“UPDATE child_table.parentid where some_field = mytempvalue”的正确值。我通常最终使用现有的文本字段进行临时存储,然后将parentId和text字段更新为正确的值。

答案 1 :(得分:1)

您可以使用 INSTEAD OF INSERT 触发器执行此操作:

CREATE TRIGGER trig_insert_ctable
ON ctable
INSTEAD OF INSERT
AS
BEGIN
    Insert Into ptable
    Select i.pid, '??'
    From inserted i
    Where not exists ( Select * From ptable p where p.pid = i.pid )

    Insert Into ctable
    Select * From inserted
END;