Объединение не работает в операторе вставки для пустой таблицы - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь использовать функцию объединения в SQL, чтобы избежать ошибки при вставке строки с автоматически увеличивающимся идентификатором uid в таблицу с нулевым значением.Тем не менее, следующий код все еще дает мне:

"не может вставить нулевое значение в столбец '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 )"); 

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Правильный способ решить эту проблему можно с помощью столбца 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 голосов
/ 30 января 2019

Это может произойти, если в вашей исходной таблице нет строки, MAX в этом случае вернет ноль.

Чтобы предотвратить это, вы можете использовать interchange 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 .

0 голосов
/ 30 января 2019

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

...