给出一个简单的查询
$query = 'INSERT INTO `menu` (`id`,`name`,`value`) VALUES (:id,:name,:value);';
并输入params数组
$params = [':id' => '', ':name' => 'John', ':value' => 'ABC'];
其中id
是PRIMARY KEY
和AUTOINCREMENT
列。在mysql中,id
列是自动增量的,即使传递的值是空字符串''
;因为抛出错误所以同样不适用于sqlite
SQLSTATE[HY000]: General error: 20 datatype mismatch
问题:当提供空字符串时,是否有办法强制sqlite增加主键字段?
docs的背景:
在INSERT上,如果未明确给出ROWID或INTEGER PRIMARY KEY列的值,则它将自动填充未使用的整数,通常比当前使用的最大ROWID多一个。
和
如果在插入上没有指定ROWID,或者指定的ROWID的值为NULL,则会自动创建适当的ROWID。
答案 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生成下一个序列 号。