gpt4 book ai didi

MySQL - 带日期时间的复合唯一键

转载 作者:可可西里 更新时间:2023-11-01 06:44:43 26 4
gpt4 key购买 nike

我有一个事务表,其中可以针对三个属性(foo_id、bar_id)存储几行,最后一个属性是 deleted_at,这里的想法是确保我一次只有一个事件行(deleted_at = ' 0000-00-00 00:00:00').

但是我收到以下错误:

mysql> UPDATE epic_table SET deleted_at = NOW() WHERE (foo_id = '1' AND bar_id IN ('18'));
ERROR 1062 (23000): Duplicate entry '18-1-2015-08-08 16:35:46' for key 'epic_table_ibuk_1'

这是架构:

CREATE TABLE `epic_table` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`foo_id` bigint(20) unsigned NOT NULL,
`bar_id` bigint(20) unsigned NOT NULL,
`created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`deleted_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `epic_table_ibuk_1` (`foo_id`,`bar_id`,`deleted_at`),
KEY `epic_table_ibfk_1` (`foo_id`),
KEY `epic_table_ibfk_2` (`bar_id`),
CONSTRAINT `epic_table_ibfk_1` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`),
CONSTRAINT `epic_table_ibfk_2` FOREIGN KEY (`bar_id`) REFERENCES `bar` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8

唯一立即突出的是 MySQL 可能没有考虑日期时间值的时间部分,因此提示另一行 18-1-2015-08-08

我有什么想法可以保持多行的灵 active ,同时能够强制在任何给定时间只有一行是“事件的”吗?

最佳答案

从评论变成答案...

声明:

UPDATE epic_table SET deleted_at = NOW() 
WHERE (foo_id = '1' AND bar_id IN ('18'));

尝试为所有具有 foo_id = 1bar_id = 18 的行设置 deleted_at。由于 foo_id、bar_id 和 deleted_at 组合被标记为唯一,因此此类更改最终会违反唯一约束。

可能只需要对这样的语句稍作改动,因为知道只有一条记录可能有 deleted_at = '0000-00-00 00:00:00':

UPDATE epic_table SET deleted_at = NOW() 
WHERE (foo_id = '1' AND bar_id IN ('18') and deleted_at = '0000-00-00 00:00:00');

关于MySQL - 带日期时间的复合唯一键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31896436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com