我试图在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 )");
答案 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。
为防止这种情况,您可以使用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 。
答案 2 :(得分:0)
如果在表本身上将该字段设置为AutoIncrement,则只需将该字段保留在Insert-Statement中即可。该值由数据库本身添加。