date(now()) 在 MySQL 8.0.22 中给出"'(' is not valid at this position, expecting 'text'"



我刚开始学习SQL和数据库创建/管理,遇到了一个似乎找不到现有答案的问题。我现在正在使用MySQL学习,我运行的是8.0.22版本。我试图使用date函数从now((中提取结果的日期部分作为默认值,但它给了我标题中指定的错误。

我试了几件事,但似乎都没有改变。

这是我首先尝试的。

INV_DATE DATE DEFAULT date(now()) NOT NULL,

然后我试了一下:

INV_DATE DATE DEFAULT date'2016-01-01' NOT NULL,

只是想看看这在语法上是否有效。当我将DATE数据类型更改为DATETIME时,NOW((本身就起作用。

我只是不太确定这个函数是怎么回事。

任何帮助都将不胜感激!

编辑:这是正在运行的上下文。

CREATE TABLE INVOICE (
INV_NUMBER INTEGER,
INV_DATE DATE DEFAULT now() NOT NULL,
PRIMARY KEY(INV_NUMBER),
FOREIGN KEY (CUS_CODE) REFERENCES CUSTOMER (CUS_CODE) ON UPDATE CASCADE);

我之所以尝试使用now((作为默认值,是因为我使用的学习材料在方言之间跳跃来演示,并且在这一部分使用Oracle SQL。它显示:

INV_DATE DATE DEFAULT SYSDATE NOT NULL,

我试着把它转换成MySQL。

规则-now()不允许作为date数据类型列的默认值。

此外,如果您想在查询中使用now(),那么您不需要date(now()),只有now()就足够了。

检查数据库<gt;fiddle查看有now()作为默认值和没有它的错误。

不幸的是,MySQL不允许date列使用默认值。你有两个合理的选择。

第一种是在insert新行时使用触发器来分配日期值。

第二种是使用datetime列和生成的列:

CREATE TABLE INVOICES (
INV_NUMBER INTEGER PRIMARY KEY,
INV_DATETIME DATETIME DEFAULT NOW(),
INV_DATE DATE GENERATED ALWAYS AS (DATE(INV_DATETIME))
);

可以使用视图(或其他机制(隐藏INV_DATETIME列。但是,您需要更新INV_DATETIME,因为INV_DATE是基于该列生成的。

相关内容

  • 没有找到相关文章

最新更新