空表中的SELECT MAX(id)返回NULL而不是0

时间:2018-07-12 13:14:48

标签: php mysql pdo sql-insert

如果某些唯一字段被重复,我需要纠正有关失败插入无效的自动增量的问题。

数据库

   id : primary key(11) NOT NULL  // !important: doesn't have auto increment
field : varchar(25) NOT NULL

查询

$field = 'field1';
try{
    $conn = new PDO("....");
    $stmt = $conn->prepare("INSERT INTO table (id,field) VALUES (((SELECT MAX(id) FROM table as table_max_id)+1),:field)");
    $stmt->bindParam(':field', $field, PDO::PARAM_STR);
    if(!$stmt->execute())
        print_r($stmt->errorInfo());//Column id cannot be null;
 }
 ...

发现的错误是:

  

列ID不能为null;

仅当表为空时,如果表中有记录,则不会发生此验证错误。

我可以通过在字段中放置伪造的id = 1来解决问题,但是我真的不喜欢它作为解决方案,有什么主意吗?

1 个答案:

答案 0 :(得分:4)

使用COALESCE将NULL表达式替换为其他内容:

SELECT COALESCE(MAX(id), 0) + 1 FROM table

我建议使用AUTO_NUMBER字段,而不要生成ID。