将列的默认值更改为表达式

时间:2018-08-10 14:23:44

标签: mariadb default

我试图在DBMS端将现有列的默认值从“完全没有默认值”更改为“明天的日期”。


更具体:

通过在表中插入数据行,默认情况下,我想在列中(插入时的时间戳)使用明天的日期。

使用的工具:

  • 用于debian-linux-gnu的MariaDB v15.1(我正在使用CLI'MariaDB 监视'我的操作)
  • 将Debian GNU / Linux 9(拉伸)作为数据中心中的虚拟服务器
  • 具有UTF-8传输功能的putty v0.65

我用于初始化列的通用SQL命令是:

ALTER TABLE test
    CHANGE COLUMN tomorrow
        tomorrow date not null default (EVIL-EXPRESSION);

上面的代码示例中的

'EVIL-EXPRESSION'只是一个占位符,用于以下可能性

default (date_add(curdate(), interval 1 day))

default (adddate(current_date(), 1))

default (now() + interval 1 day)

default (today + interval 1 day)
# today is a column declared before actual column 'tomorrow'

以及其他具有相同错误代码的版本/别名:

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 '(date_add(curdate(), interval 1 day))'
at line 1

由于错误,此错误号“ 1064(42000)”表示括号不匹配。我很确定,这里不是这样。如果是的话,那我肯定需要放假。 ;)


由于official MariaDB documentation,自版本10.2+起,默认语句中允许使用表达式。

this article还启用了此功能-为我提供了一个不起作用的示例(带有“ alter table”语句)。向下滚动直到“默认子句” 部分。

即使是邪恶的字符也不能怪我this genius pointed out这样的错误。


也许是MariaDB的错误?

当然,我可以并且实际上在服务器站点PHP脚本上进行变通,而没有任何默认值。但是我仍然有兴趣将其外包给数据库,以提高舒适度-一站式服务。 ;)

我感谢您的每一次输入,因此,请开始集思广益-因为我的大脑在抽烟。 ;)

2 个答案:

答案 0 :(得分:1)

选中CREATE TABLE::DEFAULT。验证您的MariaDB版本。

测试:

MariaDB [_]> SELECT VERSION();
+-------------------------+
| VERSION()               |
+-------------------------+
| 10.3.8-MariaDB-1:10.3.8 |
+-------------------------+
1 row in set (0.000 sec)

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

MariaDB [_]> CREATE TABLE IF NOT EXISTS `test` (
    ->   `id` SERIAL,
    ->   `today` DATE NOT NULL DEFAULT CURRENT_DATE,
    ->   `tomorrow` DATE
    -> );
Query OK, 0 rows affected (0.001 sec)

MariaDB [_]> DESC `test`\G
*************************** 1. row ***************************
  Field: id
   Type: bigint(20) unsigned
   Null: NO
    Key: PRI
Default: NULL
  Extra: auto_increment
*************************** 2. row ***************************
  Field: today
   Type: date
   Null: NO
    Key: 
Default: curdate()
  Extra: 
*************************** 3. row ***************************
  Field: tomorrow
   Type: date
   Null: YES
    Key: 
Default: NULL
  Extra: 
3 rows in set (0.001 sec)

MariaDB [_]> ALTER TABLE `test`
    ->   CHANGE COLUMN `tomorrow`
    ->   `tomorrow` DATE NOT NULL DEFAULT (`today` + INTERVAL 1 DAY);
Query OK, 0 rows affected (0.004 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [_]> DESC `test`\G
*************************** 1. row ***************************
  Field: id
   Type: bigint(20) unsigned
   Null: NO
    Key: PRI
Default: NULL
  Extra: auto_increment
*************************** 2. row ***************************
  Field: today
   Type: date
   Null: NO
    Key: 
Default: curdate()
  Extra: 
*************************** 3. row ***************************
  Field: tomorrow
   Type: date
   Null: NO
    Key: 
Default: (`today` + interval 1 day)
  Extra: 
3 rows in set (0.001 sec)

MariaDB [_]> INSERT INTO `test` (`id`) SELECT NULL;
Query OK, 1 row affected (0.000 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [_]> SELECT
    ->   `id`,
    ->   `today`,
    ->   `tomorrow`
    -> FROM
    ->   `test`;
+----+------------+------------+
| id | today      | tomorrow   |
+----+------------+------------+
|  1 | 2000-01-01 | 2000-01-02 |
+----+------------+------------+
1 row in set (0.000 sec)

答案 1 :(得分:0)

看起来是您的错误:并且您缺少paranthesys:

default (adddate(current_date(), 1)

算一下:您打开3只关闭2 !!!!