使用Trigger在Insert - SQL 2005上获取ID

时间:2009-12-09 21:03:21

标签: sql-server-2005 triggers

我有一个表(table_a),在插入时,需要从另一个表(table_b)中的available_id字段中检索下一个可用的id,以用作table_a中的主键,然后在table_b中增加available_id字段1.通过存储过程这样做很容易,我需要能够在任何插入表中发生这种情况。

我知道我需要使用触发器,但我不确定如何编写它。有什么建议吗?

基本上这是我的困境:
我需要确保两个不同的表具有唯一的ID。如果不使用GUID,最好的方法是什么? (有些代码不能在我们的最终控制,并且需要整数作为id)。

2 个答案:

答案 0 :(得分:2)

我的建议是不要!请改用身份字段。

首先,插入可以有多个记录,因此正确执行此操作的触发器必须考虑到这一点,这使得写入相当棘手。它必须是一个而不是触发器,这也是棘手的,因为你不会在初始插入中有一个必需的值(我假设你的ID字段是必需的)。在第二个位置,同时进行的两个插入可能会尝试选择相同的数字,或者如果您在一个连接中进行大量数据导入,则可以锁定第二个连接一段时间。

答案 1 :(得分:1)

您可以使用此处描述的Oracle样式序列,通过触发器或应用程序调用它(将结果值提供给插入例程):

http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server

他提到要考虑这些问题:

•如果两个进程尝试添加该怎么办?    表格中的一行完全相同    时间?你能确保一样吗?    两者都没有生成值    过程

•可以有查询的开销    每次你想要的现有数据    插入新数据

•除非将其作为一个实现    触发器,这意味着所有插入    您的数据必须始终通过    相同的存储过程    计算这些序列。这个    意味着批量进口或移动    从生产到测试的数据    等等,可能不可能或不可能    效率很低。

•如果将其作为触发器实施,    它会适用于基于集合的    多行INSERT语句?如果是这样,    它的效率如何?这个    如果要求,函数将无法工作    单个基于集合的INSERT中的每一行     - 返回的每个NextCustomerNumber()都是相同的值。