【问题标题】:date(now()) giving "'(' is not valid at this position, expecting 'text'" in MySQL 8.0.22 [duplicate]date(now()) 在 MySQL 8.0.22 中给出“'(' 在这个位置无效,期待'text'” [重复]
【发布时间】:2021-04-05 21:42:00
【问题描述】:

我对学习 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 等价物。

【问题讨论】:

  • 这不是CREATE TABLE .. 语法吗?
  • @tcadidot0 是的,这是在表中定义的属性之一。
  • 我熟悉TIMESTAMPDATETIME 数据类型具有DEFAULTNOW()CURRENT_TIMESTAMP() 在MySQL 但我不认为有一个DATE 值。 Fiddle for further tests.
  • @tcadidot0 对于查询,使用 DATE(NOW()) 没有问题 在某些情况下必须使用该列时,使用 DATETIME 列而不是 DATE 可能会导致查询复杂度增加复杂的情况。作为最终结果,这可能会降低性能。
  • @tcadidot0 是的,我现在明白了。正是我使用它的方式导致了这个问题。

标签: mysql sql


【解决方案1】:

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

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

检查db<>fiddle 以查看now() 作为默认值和没有它的错误。

【讨论】:

  • 好的,谢谢。我使用的学习材料在不同的 sql 方言之间切换来教授它的概念,这个特定的例子是使用 Oracle sql。它是:INV_DATE DATE DEFAULT SYSDATE NOT NULL 在这种情况下是否不能转换为 MySQL,因为 now() 不能使用?
  • 规则 - now() 不允许作为列的默认值。 - 仅适用于 DATE 数据类型列。但它适用于 DATETIME/TIMESTAMP 列,甚至适用于数字/字符串数据类型(形式为 DEFAULT (now()))。 dbfiddle.uk/…
  • @Akina 谢谢!这就说得通了。我想我现在明白问题所在了。
  • 是的@Akina,示例代码基于 DATE 数据类型。所以提到它。但让我在这里提一下。
  • @Akina 我还没有接触到触发器,所以我还有一些学习要做。我的原始问题已得到解答,因此我将接受此答案。
【解决方案2】:

不幸的是,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 是基于该列生成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-19
    • 2019-06-13
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多