【问题标题】:mysql #1067 - Invalid default value for 'created_at'mysql #1067 - 'created_at' 的默认值无效
【发布时间】:2018-07-06 19:46:04
【问题描述】:

我正在学习一个在线课程,其中包括创建一个 Wordpress 插件。 当我尝试按照说明(并使用提供的代码排除我这边的任何错误)创建自定义表时出现问题。 这是一段原代码:

    $sql = "CREATE TABLE {$wpdb->prefix}ssp_survey_responses (
        id mediumint(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        ip_address varchar(32) NOT NULL,
        survey_id mediumint(11) UNSIGNED  NOT NULL,
        response_id mediumint(11) UNSIGNED  NOT NULL,
        created_at TIMESTAMP DEFAULT '1970-01-01 00:00:00',
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        PRIMARY KEY  (id),
        UNIQUE INDEX ix (ip_address,survey_id)
        ) $charset_collate;";

我尝试直接在MySQL数据库中插入SQL,清理代码:

CREATE TABLE ssp_survey_responses (
        id mediumint(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        ip_address varchar(32) NOT NULL,
        survey_id mediumint(11) UNSIGNED  NOT NULL,
        response_id mediumint(11) UNSIGNED  NOT NULL,
        created_at TIMESTAMP DEFAULT '1970-01-01 00:00:01',
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        PRIMARY KEY  (id),
        UNIQUE INDEX ix (ip_address,survey_id)
        )

而 MySQL 给出了这个错误

#1067 - 'created_at' 的默认值无效

MySQL(意大利语)的本地设置可能会造成任何问题吗? MySQL 版本是::5.7.21-0ubuntu0.16.04.1 - (Ubuntu)。 PHP 版本 7.0.22。 WordPress 版本:4.9.2。 谢谢。

【问题讨论】:

    标签: php mysql wordpress timestamp


    【解决方案1】:

    时间戳是自 1970 年 1 月 1 日以来的秒数。这意味着这实际上是一个整数,而不是一个字符串。如果您希望默认值位于该点 (1970-01-01 00:00),请将其指定为 DEFAULT 0。字符串不能传递到时间戳中。

    CREATE TABLE ssp_survey_responses (
        id mediumint(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        ip_address varchar(32) NOT NULL,
        survey_id mediumint(11) UNSIGNED  NOT NULL,
        response_id mediumint(11) UNSIGNED  NOT NULL,
        created_at TIMESTAMP DEFAULT 0,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        PRIMARY KEY  (id),
        UNIQUE INDEX ix (ip_address,survey_id)
    )
    

    【讨论】:

    • 谢谢,但不幸的是它给出了同样的错误。
    • 我已经测试了这个查询,它对我有用。您正在运行哪些版本的 MySQL,以及如何运行此查询?
    • MySQL 版本为: : 5.7.21-0ubuntu0.16.04.1 - (Ubuntu)。我使用 Phpmyadmin 对数据库执行查询。我在 localhost (Linux Mint) 上本地工作。
    • 这给了我 '0000-00-00 00:00:00' 作为默认值。在 MySQL 5.7.20
    • 这可能解释了 Zoltan 和 Sandexor 的结果不匹配:stackoverflow.com/a/37696251/5685406
    【解决方案2】:

    您需要像这样根据您的时区编辑您的默认时间戳(假设 GMT+1):

    CREATE TABLE ssp_survey_responses (
        id mediumint(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        ip_address varchar(32) NOT NULL,
        survey_id mediumint(11) UNSIGNED  NOT NULL,
        response_id mediumint(11) UNSIGNED  NOT NULL,
        created_at TIMESTAMP DEFAULT '1970-01-01 01:00:01',
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        PRIMARY KEY  (id),
        UNIQUE INDEX ix (ip_address,survey_id)
        )
    

    如果您的时区是 GMT+X(其中 X 是一个正数),那么转换回 GMT 的时间戳将是一个负数,这确实是无效的。 在这里,这个时间戳被转换回 00:00:01 GMT 存储为 0。

    【讨论】:

    • 这不是真的,时区是在服务器上设置的,所以如果没有指定它使用服务器上设置的时区。这里的问题是时间戳不能是字符串。
    • 您的查询创建了表,但是 MySQL 给了我这个错误:#1292 - Incorrect datetime value: '1970-01-01 00:00:01T00:00' for column 'created_at' at row 1 . 我应该做一些改变以使查询适应意大利格林尼治标准时间(+1)吗?如果是这样,我该怎么办?谢谢。
    • 我编辑了我的答案。我认为您的 SQL 模式与我的不同。
    猜你喜欢
    • 1970-01-01
    • 2016-08-21
    • 2019-02-28
    • 2020-12-01
    • 2014-12-07
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多