将新ID级联到第二个相关表

时间:2012-06-25 23:40:25

标签: tsql sql-server-2005 insert-update

我有两个表,Contacts和Contacts_Detail。我将记录导入到Contacts表中,需要运行SP以在Contacts_Detail表中为Contacts中的每个新记录创建记录。 Contacts表中有一个ID,Contacts_Detail表中有一个匹配的ID_D。

我正在使用它将记录插入Contacts_Detail,但获取“子查询返回的值超过1”。错误,我无法弄清楚为什么。联系人中有多个记录需要在Contacts_Detail中具有匹配的记录。

  Insert into Contacts_Detail (ID_D)

  select id from Contacts c
  left join Contacts_Detail cd
  on c.id = cd.id_d
  where id_d is null

我愿意接受更好的方式...... 谢谢。

2 个答案:

答案 0 :(得分:0)

听起来你正在将空白子记录插入到Contacts_Detail表中 - 所以我要问的第一个问题是:为什么?

至于为什么你的特定SQL不起作用......

您可以检查一些事项:

  • 联系人表格 - 您有WHERE id is null的任何记录吗? (删除它们 - 然后将id字段作为主键)
  • Contacts_Detail table - 你有WHEERE id_d is null的记录吗? (删除它们 - 然后进入你的设计师并建立一种关系 /强制参照完整性。)
  • 验证c.id是主要的 key,和cd.id_d是关联表的正确外键。

希望有所帮助

答案 1 :(得分:0)

为什么不只是一个触发器?这似乎比必须确定哪些行丢失更简单 - 这似乎更像是你会定期纠正某些异常的事情,而不是每次插入后你都应该做的事情。这样的事情应该有效:

CREATE TRIGGER dbo.NewContacts
ON dbo.Contacts
FOR INSERT
AS
BEGIN
  INSERT dbo.Contacts_Detail(ID_D) SELECT ID FROM inserted;
END
GO

但是我怀疑你在Contacts_Detail表上有一个触发器,它没有被写入以正确处理多行插入,而这正是你的子查询错误的来源。你能在Contacts_Detail上显示触发器吗?