Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新重复密钥时出现MySQL默认值错误_Mysql - Fatal编程技术网

更新重复密钥时出现MySQL默认值错误

更新重复密钥时出现MySQL默认值错误,mysql,Mysql,为什么我会犯这个错误?MySQL版本是否发生了一些变化,导致这个(曾经工作过)现在失败了?INSERT INTO未指定完成插入时所需的user_id值,但由于id 1已存在,因此这应成为一个更新并有效 mysql> select * from article; +----+---------+---------------------+-----------+-----------+ | id | user_id | published_at | title | co

为什么我会犯这个错误?MySQL版本是否发生了一些变化,导致这个(曾经工作过)现在失败了?INSERT INTO未指定完成插入时所需的user_id值,但由于id 1已存在,因此这应成为一个更新并有效

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
    列没有指定默认值
  • 您也没有在查询中指定它的值
  • PS:这个问题与关于重复密钥更新的
    子句无关-如果您不使用它,它将是相同的错误


    PPS:无论是否触发了重复密钥更新上的
    插入
    都应满足所有约束条件

    用户id
    表设置默认值:
    更改表文章
    添加用户id int(11)非空默认值{DEFAULT\u VALUE}

    或者在此之后从NOTNULL更改为NULL

    ——同样应该对
    标题
    内容
    列进行更改(这将导致一个奇怪的结构),所有这些都是真实的和可理解的。但这是一个现有库的测试用例,我只是尝试修改库并确保所有单元测试仍然通过:-(理论上,在我从Github克隆库之前,这个测试用例在某个时候起作用了。也许MySQL在较旧的版本中更为宽松,允许这个公认的奇怪的DDL和SQL工作?@CXJ:我不确定。我预计这个查询会失败。这取决于是否启用了strict模式。在某些情况下,我还认为它允许缺少默认值。)多行插入并为具有相同值的单行插入引发错误。这在5.5中不是问题,但在5.7(可能是5.6)中似乎确实存在问题-可能是@Vatev所说的严格模式问题。