【问题标题】:Is it possible to create an UNIQUE KEY using only the date from a datetime column as one of the parameters?是否可以仅使用日期时间列中的日期作为参数之一来创建唯一键?
【发布时间】:2014-09-18 11:30:37
【问题描述】:

这是我正在尝试执行的查询,但它不起作用。

ALTER TABLE values ADD UNIQUE(id_cod, id_op, (SELECT date(V.completed_date) FROM values V;));

我在值表中有这 3 列:id_codid_opcompleted_date,我想将它们用于 UNIQUE KEY,但我只使用日期的日期部分对我来说至关重要-时间。

【问题讨论】:

    标签: mysql sql datetime unique


    【解决方案1】:

    你有三个选择,没有一个是很好的选择。

    第一个是为日期添加一个单独的列。您可以使用触发器来维护它,然后使用该列创建唯一索引。

    您可以将列拆分为两部分,一个日期和一个时间。然后只使用日期部分作为索引。

    您可以使用格式 YYYY-MM-DD HH:MM:SS 将字段表示为字符串。然后你可以在这个字段上使用前缀索引:create unique index idx_values_3 on values(id_code, id_op, datestr(10))

    我认为第二种选择是最合理的。

    【讨论】:

    • 我同意第二个选项是最好的。我不同意这不是一个很好的选择 :-) 似乎 id_code + id_op + date 构建了表的自然键,而时间只是一个附加信息。因此,将两者分开是完全有意义的。
    • @ThorstenKettner 。 . .其他数据库支持基于函数的索引或计算列上的索引。这些是实现此类唯一索引的更好方法。
    • 是的,我知道它们,并且在谈到旨在加快访问速度的索引时我同意。但是,在这里,我们谈论的是唯一索引。 id_code + id_op + date 唯一标识一条记录。我认为将这样的密钥与其他数据分开是很好的。
    【解决方案2】:

    你不能在 MySQL 中这样做。

    您可以添加第四列completed_date_d DATE,将其包含到唯一约束中并创建一个触发器,该触发器将使用completed_date 的日期部分更新该列。

    【讨论】:

    • 感谢您的建议!对我有用。
    猜你喜欢
    • 2010-10-11
    • 2011-11-24
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多