我现在想出了一个解决方法,但我对将来的参考感到好奇......
如果mysql表列定义为NOT NULL但具有默认值,则在插入语句中未指定列名时将插入该默认值,或者如果指定关键字DEFAULT作为值。如果在NOT NULL列上专门使用NULL作为值,即使该列具有默认值,它也会尝试插入NULL并抛出错误。
但有没有办法将DEFAULT关键字指定为参数化INSERT语句中的值?我不想忽略insert语句中的列,因为我想对多个数据集使用相同的语句,其中一些实际上有该列的数据。
答案 0 :(得分:2)
当然,没有办法使用参数来完成任务。
然而,要省略这个领域不是那么复杂或不寻常的任务,要拒绝这样的机会。
相反,在某种程度上,您会看到每个查询都是动态的,或多或少。一个人必须学会驯服他们。这不是什么大不了的事。特别是对于要求自动化的插入或更新查询,即使在常规情况下也是如此。
一个简单的辅助函数,它接受一个包含允许字段名称的数据和数组的数组,同时返回带有占位符和数组的查询以及要绑定的数据,将轻松解决您的问题。
答案 1 :(得分:0)
如果你想要一个INSERT语句将NULL视为列的默认值,这是一个解决方案:
我创建了一个表:
CREATE TABLE `foo` (
`x` INT DEFAULT '768'
)
然后我用PDO测试了几个预备语句INSERT:
$stmt = $pdo->prepare("INSERT INTO foo (x) VALUES (COALESCE(?, DEFAULT(x)))");
$stmt->execute( [ 42 ] ); // inserts a real value
$stmt->execute( [ NULL ] ); // inserts the column's default value
我确认了测试:
mysql> select * from foo;
+------+
| x |
+------+
| 42 |
| 768 |
+------+
使用PHP 5.5.12和MySQL 5.6.17进行测试。