合并在 null table 的插入语句中不起作用

Coalesce not working in insert statement for a null table

我正在尝试使用 SQL 中的 coalesce 函数来避免在将具有自动递增 uid 的行插入到空的 table 中时出现错误。然而,下面的代码仍然给我:

"cannot insert the value null into column 'TABLE_ONE_UID'".

cmdEx.ExecuteNonQuery(
    "INSERT INTO TABLE_ONE 
            (TABLE_ONE_UID, USER_UID, SHT_DATE, 
            C_S_UID, CST_DATE, 
            CET_DATE, S_M, PGS) 
    VALUES ((SELECT MAX(COALESCE(TABLE_ONE_UID, 0)) + 1 
                FROM TABLE_ONE), 
            127, '2009-06-15T13:45:30', 
            0, '2009-06-15T13:45:30','2010-06-15T13:45:30', 
            'TEST DELETE THIS ROW', 0 )");

如果该字段在 table 本身上设置为 AutoIncrement,只需将该字段保留在您的插入语句之外。该值由数据库自己添加。

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

当您的源 table 没有任何行时会发生这种情况,在这种情况下 MAX 将 return 为空。

为防止这种情况,您可以使用互换 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