我有一个表(table_a),在插入时,需要从另一个表(table_b)中的available_id字段中检索下一个可用的id,以用作table_a中的主键,然后在table_b中增加available_id字段1.通过存储过程这样做很容易,我需要能够在任何插入表中发生这种情况。
我知道我需要使用触发器,但我不确定如何编写它。有什么建议吗?
基本上这是我的困境:
我需要确保两个不同的表具有唯一的ID。如果不使用GUID,最好的方法是什么? (有些代码不能在我们的最终控制,并且需要整数作为id)。
答案 0 :(得分:2)
我的建议是不要!请改用身份字段。
首先,插入可以有多个记录,因此正确执行此操作的触发器必须考虑到这一点,这使得写入相当棘手。它必须是一个而不是触发器,这也是棘手的,因为你不会在初始插入中有一个必需的值(我假设你的ID字段是必需的)。在第二个位置,同时进行的两个插入可能会尝试选择相同的数字,或者如果您在一个连接中进行大量数据导入,则可以锁定第二个连接一段时间。
答案 1 :(得分:1)
您可以使用此处描述的Oracle样式序列,通过触发器或应用程序调用它(将结果值提供给插入例程):
http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server
他提到要考虑这些问题:
•如果两个进程尝试添加该怎么办? 表格中的一行完全相同 时间?你能确保一样吗? 两者都没有生成值 过程
•可以有查询的开销 每次你想要的现有数据 插入新数据
•除非将其作为一个实现 触发器,这意味着所有插入 您的数据必须始终通过 相同的存储过程 计算这些序列。这个 意味着批量进口或移动 从生产到测试的数据 等等,可能不可能或不可能 效率很低。
•如果将其作为触发器实施, 它会适用于基于集合的 多行INSERT语句?如果是这样, 它的效率如何?这个 如果要求,函数将无法工作 单个基于集合的INSERT中的每一行 - 返回的每个NextCustomerNumber()都是相同的值。