首页 > 解决方案 > 空表中的 SELECT MAX(id) 返回 NULL 而不是 0

问题描述

我需要解决有关插入失败时自动递增无效的问题,以防某些唯一字段重复。

数据库

   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 不能为空;

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

我可以通过放置一个带有 fake 的字段来解决问题id = 1,但我真的不喜欢它作为解决方案,有什么想法吗?

标签: phpmysqlpdosql-insert

解决方案


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

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

我建议使用AUTO_NUMBER字段而不是生成 id。


推荐阅读