首页 文章

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

提问于
浏览
0

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

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

基本上这是我的困境:
我需要确保2个不同的表具有唯一的id 's throughout. What would be the best way to do this without using GUID' s? (有些代码不能在我们的最终控制,并要求int作为id) .

2 回答

  • 1

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

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

  • 2

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

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

    他提到要考虑这些问题:

    •如果两个进程尝试在同一时间向表中添加行,该怎么办?您能确保不为两个进程生成相同的值吗?

    •每次要插入新数据时,都可能会有查询现有数据的开销

    •除非将其作为触发器实现,否则这意味着对数据的所有插入必须始终通过计算这些序列的相同存储过程 . 这意味着批量导入或将数据从 生产环境 转移到测试等可能是不可能的,或者可能效率非常低 .

    •如果将其实现为触发器,它是否适用于基于集合的多行INSERT语句?如果是这样,它会有多高效?如果在单个基于集合的INSERT中调用每一行,则此函数将不起作用 - 返回的每个NextCustomerNumber()将是相同的值 .

相关问题