【问题标题】:MariaDB syntax support weirdMariaDB 语法支持怪异
【发布时间】:2017-12-25 22:00:58
【问题描述】:

我有几个 MariaDB 实例,例如10.1.17、10.1.25 和 10.2.6

我做了一个 SQL 可以在 10.2.6 和 10.1.17 上运行,但不能在 10.1.25 上运行,我不知道为什么。

ALTER TABLE FOOBAR ALTER CREATED SET DEFAULT NOW();

您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 'NOW()' 附近使用的正确语法

在 10.1.25 上有效的是 CREATE TABLE,但只有 CURRENT_TIMESTAMP 而不是 NOW()

CREATE TABLE `FOOBAR` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `CREATED` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我也试过了,但还是不行。

ALTER TABLE FOOBAR ALTER CREATED SET DEFAULT CURRENT_TIMESTAMP;

【问题讨论】:

  • 也许他们希望开发人员使用 ANSI SQL 的 current_timestamp 而不是专有的 now()。
  • 奇怪,根据this,它应该可以工作。也许尝试将其更改为CURRENT_TIMECURRENT_TIMESTAMP()
  • CURRENT_TIMESTAMP()CURRENT_TIME 也不适用于 ALTER TABLECREATE TABLE
  • 在 10.1.25 中的表 FOOBAR 中的列 CREATED 是什么类型? datetime?
  • 是的,它来自 datetime 类型,以避免 timestamp 的 2038 年问题

标签: sql mariadb


【解决方案1】:

我无法重现该问题:

MariaDB [_]> SELECT VERSION();
+-----------------+
| VERSION()       |
+-----------------+
| 10.1.25-MariaDB |
+-----------------+
1 row in set (0.00 sec)

MariaDB [_]> DROP TABLE IF EXISTS `FOOBAR`;
Query OK, 0 rows affected (0.00 sec)

MariaDB [_]> CREATE TABLE `FOOBAR` (
    ->   `ID` bigint(20) NOT NULL AUTO_INCREMENT,
    ->   `CREATED_0` DATETIME DEFAULT NOW(),
    ->   `CREATED_1` DATETIME DEFAULT CURRENT_TIMESTAMP(),
    ->   `CREATED_2` TIMESTAMP DEFAULT NOW(),
    ->   `CREATED_3` TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
    ->   `CREATED_4` DATETIME,
    ->   `CREATED_5` DATETIME,
    ->   PRIMARY KEY (`ID`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)

MariaDB [_]> SHOW CREATE TABLE `FOOBAR`\G
*************************** 1. row ***************************
       Table: FOOBAR
Create Table: CREATE TABLE `FOOBAR` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `CREATED_0` datetime DEFAULT CURRENT_TIMESTAMP,
  `CREATED_1` datetime DEFAULT CURRENT_TIMESTAMP,
  `CREATED_2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `CREATED_3` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `CREATED_4` datetime DEFAULT NULL,
  `CREATED_5` datetime DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

CREATE TABLE :: DEFAULT

...

在 MariaDB 10.2.1 之前,您通常无法提供表达式或 在插入时进行评估的函数。你必须提供一个常数 而是默认值。一个例外是您可以使用 CURRENT_TIMESTAMP 作为要使用的 TIMESTAMP 列的默认值 插入时的当前时间戳。

...

10.0.1开头的MariaDB

CURRENT_TIMESTAMP 也可以用作DATETIME 的默认值

但是,以下语句失败:

MariaDB [_]> ALTER TABLE `FOOBAR`
    ->   ALTER COLUMN `CREATED_4` SET DEFAULT NOW();
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
                    that corresponds to your MariaDB server version for the
                    right syntax to use near 'NOW()' at line 2

MariaDB [_]> ALTER TABLE `FOOBAR`
    ->   ALTER COLUMN `CREATED_5` SET DEFAULT CURRENT_TIMESTAMP();
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
                    that corresponds to your MariaDB server version for the
                    right syntax to use near 'CURRENT_TIMESTAMP()' at line 2

ALTER TABLE

...

10.2.1开头的MariaDB

DEFAULT 与表达式和DROP CONSTRAINT 在 MariaDB 10.2.1 中引入

...


来自 MariaDB 10.2.1

句子:

MariaDB [_]> ALTER TABLE `FOOBAR`
    -> ALTER COLUMN `CREATED_4` SET DEFAULT NOW(),
    -> ALTER COLUMN `CREATED_5` SET DEFAULT CURRENT_TIMESTAMP();

会起作用,请参阅db<>fiddle

【讨论】:

    【解决方案2】:

    你可以试试这个: ALTER TABLE table_name ADD type TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER name;

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 2023-03-21
      • 2012-02-09
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2015-08-08
      相关资源
      最近更新 更多