更新重复密钥时出现MySQL默认值错误
为什么我会犯这个错误?MySQL版本是否发生了一些变化,导致这个(曾经工作过)现在失败了?INSERT INTO未指定完成插入时所需的user_id值,但由于id 1已存在,因此这应成为一个更新并有效更新重复密钥时出现MySQL默认值错误,mysql,Mysql,为什么我会犯这个错误?MySQL版本是否发生了一些变化,导致这个(曾经工作过)现在失败了?INSERT INTO未指定完成插入时所需的user_id值,但由于id 1已存在,因此这应成为一个更新并有效 mysql> select * from article; +----+---------+---------------------+-----------+-----------+ | id | user_id | published_at | title | co
mysql> select * from article;
+----+---------+---------------------+-----------+-----------+
| id | user_id | published_at | title | content |
+----+---------+---------------------+-----------+-----------+
| 1 | 1 | 2011-12-10 12:10:00 | article 1 | content 1 |
| 2 | 2 | 2011-12-20 16:20:00 | article 2 | content 2 |
| 3 | 1 | 2012-01-04 22:00:00 | article 3 | content 3 |
+----+---------+---------------------+-----------+-----------+
3 rows in set (0.00 sec)
mysql> desc article;
+--------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+-------------------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| user_id | int(11) unsigned | NO | MUL | NULL | |
| published_at | datetime | NO | | CURRENT_TIMESTAMP | |
| title | varchar(100) | NO | | NULL | |
| content | text | NO | | NULL | |
+--------------+------------------+------+-----+-------------------+----------------+
5 rows in set (0.01 sec)
mysql> INSERT INTO article (id)
-> VALUES (1)
-> ON DUPLICATE KEY UPDATE title = 'article 1b', content = 'content 1b';
ERROR 1364 (HY000): Field 'user_id' doesn't have a default value
MySQL版本5.6.12。您收到的错误是因为
user\u id
列定义为notnull
user\u id
列没有指定默认值子句无关-如果您不使用它,它将是相同的错误
PPS:无论是否触发了重复密钥更新上的,插入都应满足所有约束条件为用户id
表设置默认值:更改表文章
添加用户id int(11)非空默认值{DEFAULT\u VALUE}
或者在此之后从NOTNULL更改为NULL——同样应该对标题
和内容
列进行更改(这将导致一个奇怪的结构),所有这些都是真实的和可理解的。但这是一个现有库的测试用例,我只是尝试修改库并确保所有单元测试仍然通过:-(理论上,在我从Github克隆库之前,这个测试用例在某个时候起作用了。也许MySQL在较旧的版本中更为宽松,允许这个公认的奇怪的DDL和SQL工作?@CXJ:我不确定。我预计这个查询会失败。这取决于是否启用了strict模式。在某些情况下,我还认为它允许缺少默认值。)多行插入并为具有相同值的单行插入引发错误。这在5.5中不是问题,但在5.7(可能是5.6)中似乎确实存在问题-可能是@Vatev所说的严格模式问题。