2010-05-25 66 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