INTREAD OF TRIGGER获取独特的PK ID

时间:2014-01-21 19:29:31

标签: sql-server tsql triggers

我有table_1通过以下声明从table_2获取数据:

INSERT INTO database1.tbl_1 (idx, user_id, stasus_idx) 
    SELECT idx, user_id, stasus_idx  
    FROM database2.table_2 
    WHERE stasus_idx = 591

table_1具有与table_2完全相同的列结构,但开头有一个额外的列可提供唯一的ID。所以table_1列看起来像这样:

ID, idx, user_id, stasus_idx

我已经创建了INSTEAD OF TRIGGER,如下所示:

CREATE TRIGGER trg_ID ON table_1
INSTEAD OF INSERT
AS
BEGIN
   SET IDENTITY_INSERT table_1 ON
   .
   . -- trigger
   .
   SET IDENTITY_INSERT table_1 OFF
END

....为每一行插入新的唯一ID,但id不能按预期工作。它只是插入 1记录并完成。我可以将所有行都提取到CURSOR中并逐个处理,但这样效率会非常低。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

也许序列可以解决您的问题。您可以使用以下语法轻松定义一个:

create sequence sequence_name as int start with 1 increment by 1;

请注意,默认类型为bigint。并且序列似乎从最小值开始,而不是默认为1。

然后,您可以使用default在表格中使用这些内容。这是一个例子:

create table t1 (
  id int primary key default (next value for test),
  id2 int identity unique,
  val int
);

Here是一个简单的SQL小提琴,用来说明它们。我在评论中提到的文档似乎非常有用。

答案 1 :(得分:0)

如果您无法更改数据库以使用序列,那么您应该能够在没有触发器的情况下使用原始查询。只需在查询周围添加SET IDENTITY_INSERT语句。

SET IDENTITY_INSERT database1.tbl_1 ON;

INSERT INTO database1.tbl_1 (ID, idx, user_id, stasus_idx ) 
    SELECT ID, idx, user_id, stasus_idx  FROM database2.table_2 
    WHERE stasus_idx = 591;

SET IDENTITY_INSERT database1.tbl_1 OFF;