我有多个级别的父子表(GrandParent,Parent和Child,所有多对一关系,一个父有多个子节点,所有子节点都有一个父节点)。每个都有自动身份密钥。使用C#和存储过程,如何使用外键约束插入它们? 例如,要插入的数据包括多个祖父母,每个毕业父母有多个父母,每个父母有多个孩子。
示例数据:
campus <- building <- office
增加一些校园和相关建筑物/办公室。
答案 0 :(得分:3)
您可以使用SCOPE_IDENTITY()
函数检索上次插入的自动增量ID:
DECLARE @new_parent_id INT
INSERT INTO MyParent(...) VALUES(...) -- your new parent data
SELECT @new_parent_id = SCOPE_IDENTITY()
INSERT INTO MyChild(parent_id, ...) VALUES(@new_parent_id, ...)
这是你的意思吗?
修改强>:
使用表值参数,您确实可以使用ADO.NET和SQL Server 2008一次传入所有数据:
http://msdn.microsoft.com/en-us/library/bb675163.aspx
您可以将父数据和子数据作为两个表传递给存储过程,然后使用游标循环访问父项,插入一个,获取生成的ID,然后在继续下一个父项之前插入所有子项。
这可能是最有效的解决方案,可能只需要对数据库进行一次调用,如果要插入大量数据,或者如果您认为可以在解决方案的其他位置重用此SP,那么这可能是要走的路。
但是,我认为从客户端应用程序逐个插入记录是一种更清晰,更简单的方法来实现您想要的。
答案 1 :(得分:1)
我认为你真正需要的是database trigger。除了约束中的直接表引用完整性之外,您不能强制实施自定义逻辑。如果你想要自定义逻辑(必须有2个父母等),那么你将不得不使用数据库触发器。
你可以这样做(伪代码):
BEFORE INSERT
IF INSERT CAUSES MORE THAN 2 PARENTS
DO NOT ALLOW INSERT
ELSE
ALLOW INSERT