我有一个父表
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
中创建一行。可以这样做吗?
答案 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;