归结到问题的本质,我有一个带有日期时间字段的MySQL表(InnoDB),我需要实现一个重复的检查,它不允许同一日期,直到小时,被多次使用(例如。只有一排有2013-07-18 13:xx:xx)。
那么,我的第一个问题是,在MySQL数据库本身中是否存在强制执行此操作的方法?
否则,我的做法将是:
我真的不喜欢这个解决方案-任何关于如何做到这一点而不必锁定桌子的建议将不胜感激。
发布于 2013-07-18 14:15:17
在MySQL中没有简单的、声明式的方法来实现这一点。但是您可以创建一个隐藏列,并使用触发器来保持数据的一致性。这假设"ts“(下面)可以是任何有效的时间戳,但是您希望每小时只需要其中一个。
create table test (
ts datetime not null,
ts_uniq char(13) not null,
unique (ts_uniq)
);列"ts_uniq“是隐藏列。它将包含类似“2013-01-01-08”之类的字符串。
create trigger bef_ins_test
before insert on test
for each row
set new.ts_uniq = date_format(new.ts, '%Y-%m-%d %H');您需要一个类似的触发器,在更新之前执行。
create trigger bef_upd_test
before update on test
for each row
set new.ts_uniq = date_format(new.ts, '%Y-%m-%d %H');当您插入"ts“值时,阴影列将自动正确设置。
insert into test (ts) values ('2013-01-01 08:35:33');
select * from test;
ts ts_uniq
--
2013-01-01 08:35:33 2013-01-01 08尝试插入稍微不同的值会失败,引发错误代码1062 (重复条目)。
insert into test (ts) values ('2013-01-01 08:47:13');如果更新现有时间戳,则"ts_uniq“列的”前更新触发器“保持一致。
update test
set ts = '2013-01-01 17:42:42';
select * from test;
ts ts_uniq
--
2013-01-01 17:42:42 2013-01-01 17尝试独立更新"ts_uniq“不会引发错误,但也不会更改该行。
update test
set ts_uniq = '2013-12-31 18';
select * from test;
ts ts_uniq
--
2013-01-01 17:42:42 2013-01-01 17https://stackoverflow.com/questions/17722732
复制相似问题