【问题标题】:Coalesce not working in insert statement for a null table合并在空表的插入语句中不起作用
【发布时间】:2019-06-23 16:55:08
【问题描述】:

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

“无法将 null 值插入到列 '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 )");

【问题讨论】:

标签: mysql sql increment coalesce


【解决方案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 ;

【讨论】:

  • 谢谢,我实际上已经尝试过第一个选项,但我不知道如何在我的插入语句中使用它。尝试添加时不断收到语法错误:int auto_increment 主键,在 PMS_CALC_SCHEDULE_UID 旁边。我应该如何在插入列中使用它?由于该表可能已经存在也可能不存在,因此不能选择创建表。
  • @JoeJoeJoe 。 . .你根本不插入它。将其排除在列和值列表之外。或者,您可以将其包含在NULL 中——MySQL 知道在这种情况下该怎么做。
【解决方案2】:

当您的源表没有任何行时会发生这种情况,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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多