【问题标题】:mysql vs sqlite: increment with empty string primary keymysql vs sqlite:用空字符串主键递增
【发布时间】:2016-04-30 16:13:17
【问题描述】:

给定一个简单的查询

$query = 'INSERT INTO `menu` (`id`,`name`,`value`) VALUES (:id,:name,:value);';

和输入参数数组

$params = [':id' => '', ':name' => 'John', ':value' => 'ABC'];

其中idPRIMARY KEYAUTOINCREMENT 列。在 mysql 中,id 列会自动递增,即使传递的值为空字符串 '';这同样不适用于 sqlite,因为会引发错误

SQLSTATE[HY000]: General error: 20 datatype mismatch

问题:有没有办法强制sqlite在提供空字符串时增加主键字段?

docs的背景:

在 INSERT 中,如果 ROWID 或 INTEGER PRIMARY KEY 列没有显式指定值,那么它将自动填充一个未使用的整数,通常比当前使用的最大 ROWID 大一。

如果插入时没有指定 ROWID,或者指定的 ROWID 的值为 NULL,则会自动创建适当的 ROWID。

【问题讨论】:

  • $query = 'INSERT INTO menu ('name','value') VALUES (:name,:value);';$params = [':name' => 'John', ':value' => 'ABC'];
  • @A-2-A 是的,我知道这一点。我仍然想保留空字符串参数。
  • 这是不可能的,因为它是 primaryauto-incremented 列。 primary 键不接受空值。
  • '' 在执行数据库查询时将被视为 null。我想是的

标签: php mysql database sqlite pdo


【解决方案1】:

您应该为 auto_increment 字段传递 null 或根本不指定它。对于 mysql 传递空字符串仅在某些配置设置下有效,并且因为 mysql 默默地将空字符串转换为 0,所以您不应该依赖它或期望任何其他 rdbms 效仿。

详见no_auto_value_on_zero sql mode上的mysql文档:

NO_AUTO_VALUE_ON_ZERO 会影响 AUTO_INCREMENT 列的处理。 通常,您通过以下方式为列生成下一个序列号 将 NULL 或 0 插入其中。 NO_AUTO_VALUE_ON_ZERO 抑制 此行为为 0,因此只有 NULL 生成下一个序列 号码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-22
    • 2022-11-15
    • 2015-05-11
    • 2017-01-09
    • 2011-10-22
    • 1970-01-01
    • 2015-05-05
    • 2012-12-08
    相关资源
    最近更新 更多