2010-05-25 3 views
0

когда я делаю этот запрос я есть ошибкаProbleme с приращением ид

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

Я хочу, чтобы увеличить свой идентификатор

+1

Оставьте одиночные кавычки. И скажите нам базу данных SQL, которую вы используете - MySQL? SQL-сервер? Postgres? Oracle? – Oded

+1

Вы никогда не должны назначать первичный ключ, как это, особенно если вы можете получить доступ к базе данных несколькими клиентами одновременно, потому что это может привести к дублированию идентификаторов. Большинство систем БД предоставляют последовательности или автоматически увеличивающиеся поля, которые вы должны использовать. – RoToRa

ответ

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

+0

@HLGEM как использовать.? – Mercer

+0

Зависит от базы данных onteh, которую вы используете. Это материал, специфичный для базы данных, но большинство баз данных позволяют автоматически увеличивать поле идентификатора. – HLGEM

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

рад, что вы отправили. Я собирался сделать себе идиота. –