2014-01-21 45 views
0

我有一个table_1这是从table_2通过下面的语句获取数据:INSTEAD OF触发器独特的PK ID

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并逐个处理,但效率非常低。

感谢您的帮助。

+0

难道你不能只声明'id int identity(1,1)unique'或'id int identity(1,1)primary key'? –

+0

这太容易了:),唯一的ID实际上存在于许多表中,并且在所有这些表中必须是唯一的。所以当在一个表中插入唯一的ID时,它将增加下一个表的剩余位置等等。 – Milan

+0

。 。如果您使用的是SQL Server 2012,则序列可以解决此问题(http://technet.microsoft.com/zh-cn/library/ff878058.aspx)。 –

回答

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小提琴示出它们。我在评论中提到的文件似乎非常有用。

+0

..感谢,工作。当我创建ID列指定为(sequnce_ID的下一个值)的table_1时,所有记录都插入唯一的ID,并且当继续在下一个表中ID保持先前的记录计数并从那里开始。真棒! – Milan

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; 
+0

..hi Jody,我尝试了你的建议,但是我无法让它在所有桌子上都能正常工作。不管怎样,谢谢你。 – Milan

相关问题