2011-10-03 137 views
0

帶複合主鍵的簡單表。
PK1 smallint, PK2 smallint auto increment, strValue varchar(20) not null.帶有組合主鍵自動增量一部分的SQL 2008複合主鍵

這可以工作,但PK2的增量與PK1無關。

我想讓PK2從新鮮的PK1開始新鮮。

這裏是我所得到的

1, 1, 1a 
    1, 2, 1b 
    2, 3, 2a 
    2, 4, 2b 

我想要什麼

1, 1, 1a 
    1, 2, 1b 
    2, 1, 2a 
    2, 2, 2b 

我需要它,我需要從PK2刪除自動遞增並生成INSERT語句的正確的價值?那是否是正確的方法?你推薦Insert語句的語法嗎?自動增量PK1不是一個選項,因爲它是FK關係的一部分。

假設我需要插入2,x,3b並且需要知道爲x分配了什麼值。
不會有很多插入(如100 /天)。 對PK1,strValue有一個唯一的約束。

要清楚我認爲SQL 2008做的是正確的事情,並不是說默認情況下SQL應該以這種方式運行。

回答

0

如果」再不是做大量插入到表你也許可以刪除標識列,只是做:

IF NOT EXISTS (SELECT * FROM table WHERE PK1 = 2 AND strValue = '3b') 
BEGIN 
    DECLARE @next_PK2 INT 

    SELECT 
    @next_PK2 = ISNULL(MAX(PK2) + 1, 0) + 1 
    FROM 
    table 
    WHERE 
    PK1 = 2 

    INSERT table VALUES (2, @next_PK2, '3b') 
END 
+0

是不是(ISNULL(MAX(PK2),0)+ 1?並且strValue ='3b'尚未在表格中。實際上,如果已經有'3b',我需要中止插入,因爲它會違反唯一的約束如果我把所有的事情都放在一個事務處理中,那麼將會有兩次同時插入2,x,3b的難得機會嗎?我應該在插入中放置一個tablock提示嗎? – Paparazzi

+0

我改變了代碼來處理約束 – Asken

+0

但是你沒有取出AND strValue ='3b'。清理它,我會給你檢查。謝謝 – Paparazzi

0

是的,如果你想控制PK2的增量值,你需要生成插入過程中(如用ROW_NUMBER(),沒有任何其他方式獨立設置PK2。

+3

而且要非常小心地處理競態條件 – HLGEM

+0

我只是沒有看到ROW_NUMBER()是如何回答假設我?想要插入2,x,2c。 – Paparazzi

+0

@HLGEM準確地說,數據完整性就是一切,不會有很多插入秒。如果有必要,我可以住一個TABLOCK。尋找堅如磐石的插入物。如果有必要,我可以在PK2上自動增量。 – Paparazzi