Я пытаюсь использовать функцию объединения в SQL, чтобы избежать ошибки при вставке строки с автоматически увеличивающимся идентификатором в таблицу, которая является нулевой. Тем не менее, следующий код все еще дает мне:
msgstr "невозможно вставить нулевое значение в столбец 'PMS_CALC_SCHEDULE_UID'".
cmdEx.ExecuteNonQuery(
"INSERT INTO PMS_CALC_SCHEDULE
(PMS_CALC_SCHEDULE_UID, USER_UID, SCHEDULED_DATE,
PMS_CALC_STATUS_UID, CALCULATION_START_DATE,
CALCULATION_END_DATE, STATUS_MESSAGE, PROGRESS)
VALUES ((SELECT MAX(COALESCE(PMS_CALC_SCHEDULE_UID, 0)) + 1
FROM PMS_CALC_SCHEDULE),
127, '2009-06-15T13:45:30',
0, '2009-06-15T13:45:30','2010-06-15T13:45:30',
'TEST DELETE THIS ROW', 0 )");
Правильный способ решить это с помощью столбца auto_increment
:
create table PMS_CALC_SCHEDULE (
PMS_CALC_SCHEDULE_UID int auto_increment primary key,
. . .
);
Если по какой-то причине вы хотите выполнить расчет самостоятельно, подвергнуть свой код гоночным условиям и использовать медленные вставки, то вам необходимо выполнить объединение в нужном месте:
INSERT INTO PMS_CALC_SCHEDULE (PMS_CALC_SCHEDULE_UID, . . .)
SELECT COALESCE(MAX(PMS_CALC_SCHEDULE_UID), 0) + 1,
. . .
FROM PMS_CALC_SCHEDULE ;
NULL
- MySQL знает, что делать в этом случае.
Если для поля установлено значение AutoIncrement в самой таблице, просто оставьте поле вне оператора вставки. Значение добавляется самой базой данных.
Это может произойти, если в вашей исходной таблице нет ни одной строки, в этом случае MAX
вернет ноль.
Чтобы предотвратить это, вы можете использовать обмен COALESCE
и MAX
, например:
INSERT INTO PMS_CALC_SCHEDULE
(PMS_CALC_SCHEDULE_UID, USER_UID, SCHEDULED_DATE,
PMS_CALC_STATUS_UID, CALCULATION_START_DATE,
CALCULATION_END_DATE, STATUS_MESSAGE, PROGRESS)
VALUES ((SELECT COALESCE(MAX(PMS_CALC_SCHEDULE_UID), 0) + 1
FROM PMS_CALC_SCHEDULE),
127, '2009-06-15T13:45:30',
0, '2009-06-15T13:45:30','2010-06-15T13:45:30',
'TEST DELETE THIS ROW', 0 )")
Здесь SQL Fiddle.