2014-01-21 126 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

相關問題