2010-05-25 67 views
0

當我做到這一點要求我有一個錯誤Probleme ID爲增量

INSERT INTO FR_METIERPUBLI(
D_NIDMTR, 
D_NIDPUBLI 
) 
VALUES (
'SELECT MAX(D_NIDMTR) FROM FR_METIERPUBLI + 1', 1000 

我想增加我的ID

+1

刪除單引號。並告訴我們你正在使用的SQL數據庫--MySQL? SQL服務器? Postgres的?甲骨文? – Oded 2010-05-25 14:53:00

+1

你不應該像這樣分配一個主鍵,尤其是如果你的數據庫可以被多個客戶端一次訪問,因爲這可能導致重複ID。大多數DB系統提供您應該使用的序列或自動遞增字段。 – RoToRa 2010-05-25 14:58:15

回答

1

嘗試

INSERT INTO FR_METIERPUBLI(
D_NIDMTR, 
D_NIDPUBLI) 
SELECT MAX(D_NIDMTR) +1, 1000 FROM FR_METIERPUBLI 

但是.. 非常小心這個 ..如果2操作做到這一點的同時,你會得到至少一式兩份

你可以做的(上的SQL Server )將其包裹在交易中並指定這些鎖

INSERT INTO FR_METIERPUBLI(
    D_NIDMTR, 
    D_NIDPUBLI) 
    SELECT MAX(D_NIDMTR) +1, 1000 FROM FR_METIERPUBLI with (UPDLOCK, HOLDLOCK) 

爲什麼不使用序列或標識?

+0

@Mercer,特別注意這一部分: 爲什麼你不使用序列或身份? – HLGEM 2010-05-25 15:08:39

+0

@HLGEM如何使用它。 – Mercer 2010-05-25 15:26:46

+0

取決於您使用的onteh數據庫。這是數據庫特定的東西,但大多數數據庫都有自動增加某種id字段的方法。 – HLGEM 2010-05-25 16:31:21

1

不知道的數據庫,這只是一種猜測,但試試這個:

INSERT INTO FR_METIERPUBLI 
     (D_NIDMTR,D_NIDPUBLI) 
    SELECT 
     MAX(D_NIDMTR)+ 1, 1000 
     FROM FR_METIERPUBLI 

爲SQL Server,試圖防範利用這個現有的任何行:

INSERT INTO FR_METIERPUBLI 
     (D_NIDMTR,D_NIDPUBLI) 
    SELECT 
     ISNULL(MAX(D_NIDMTR),0)+ 1, 1000 
     FROM FR_METIERPUBLI 
+0

很高興你發佈。我正要讓自己變成白癡。 – 2010-05-25 14:54:59