mysql vs sqlite:使用空字符串主键递增

时间:2016-01-24 09:38:51

标签: php mysql database sqlite pdo

给出一个简单的查询

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

并输入params数组

$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。

1 个答案:

答案 0 :(得分: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生成下一个序列   号。