合并在空表的插入语句中不起作用

时间:2019-01-30 11:57:19

标签: mysql sql increment coalesce

我试图在SQL中使用合并函数以避免在将具有自动递增uid的行插入到空表中时避免出错。但是,以下代码仍给我:

  

“无法将null值插入列'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 :(得分:1)

解决此问题的正确方法是使用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 ;

答案 1 :(得分:1)

当源表没有任何行时会发生这种情况,在这种情况下MAX将返回null。

为防止这种情况,您可以使用COALESCEMAX的互换,例如:

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

答案 2 :(得分:0)

如果在表本身上将该字段设置为AutoIncrement,则只需将该字段保留在Insert-Statement中即可。该值由数据库本身添加。