合并在 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 为空。
为防止这种情况,您可以使用互换 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。
我正在尝试使用 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 为空。
为防止这种情况,您可以使用互换 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。