Объединение не работает в операторе вставки для пустой таблицы

0

Я пытаюсь использовать функцию объединения в 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 )"); 
Теги:
coalesce
increment
table

3 ответа

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 ;
  • 0
    Спасибо, я на самом деле пробовал этот первый вариант, но я не мог понять, как использовать его в своем операторе вставки. Не удалось получить синтаксическую ошибку при попытке добавить первичный ключ: int auto_increment, рядом с PMS_CALC_SCHEDULE_UID. Как я должен использовать его в столбце вставки? поскольку таблица может существовать, а может и не существовать, создать таблицу нельзя.
  • 0
    @JoeJoeJoe. , , Вы не вставляете это вообще. Оставьте его вне списка столбцов и значений. Кроме того, вы можете включить его в NULL - MySQL знает, что делать в этом случае.
0

Если для поля установлено значение AutoIncrement в самой таблице, просто оставьте поле вне оператора вставки. Значение добавляется самой базой данных.

0

Это может произойти, если в вашей исходной таблице нет ни одной строки, в этом случае 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню