我刚开始学习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
是基于该列生成的。