首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MySQL的高级独特解析器

使用MySQL的高级独特解析器
EN

Stack Overflow用户
提问于 2013-07-18 11:53:13
回答 1查看 121关注 0票数 1

归结到问题的本质,我有一个带有日期时间字段的MySQL表(InnoDB),我需要实现一个重复的检查,它不允许同一日期,直到小时,被多次使用(例如。只有一排有2013-07-18 13:xx:xx)。

那么,我的第一个问题是,在MySQL数据库本身中是否存在强制执行此操作的方法?

否则,我的做法将是:

  1. 为读和写锁定表(以避免
  2. 进行SELECT查询以验证我可以插入新行
  3. 插入它
  4. 再次解锁桌子

我真的不喜欢这个解决方案-任何关于如何做到这一点而不必锁定桌子的建议将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-18 14:15:17

在MySQL中没有简单的、声明式的方法来实现这一点。但是您可以创建一个隐藏列,并使用触发器来保持数据的一致性。这假设"ts“(下面)可以是任何有效的时间戳,但是您希望每小时只需要其中一个。

代码语言:javascript
复制
create table test (
   ts datetime not null,
   ts_uniq char(13) not null,
   unique (ts_uniq)
);

列"ts_uniq“是隐藏列。它将包含类似“2013-01-01-08”之类的字符串。

代码语言:javascript
复制
create trigger bef_ins_test 
before insert on test
for each row
set new.ts_uniq = date_format(new.ts, '%Y-%m-%d %H');

您需要一个类似的触发器,在更新之前执行。

代码语言:javascript
复制
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“值时,阴影列将自动正确设置。

代码语言:javascript
复制
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 (重复条目)。

代码语言:javascript
复制
insert into test (ts) values ('2013-01-01 08:47:13');

如果更新现有时间戳,则"ts_uniq“列的”前更新触发器“保持一致。

代码语言:javascript
复制
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“不会引发错误,但也不会更改该行。

代码语言:javascript
复制
update test
set ts_uniq = '2013-12-31 18';

select * from test;

ts                   ts_uniq
--
2013-01-01 17:42:42  2013-01-01 17
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17722732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档