我有一个表存储有关某些事件重现的值,例如,id=1
的事件发生在星期一,星期三和星期五,而id=2
的事件发生在星期一和星期三。所以我的表是这样的:
id event_id day
1 1 Monday
2 1 Wednesday
3 1 Friday
4 2 Monday
5 2 Wednesday
我的问题是,有时(并非总是)我的脚本在我的数据库中插入重复值,因此我的表有两倍的事件1和2的重现,如下表所示:
id event_id day
1 1 Monday
2 1 Wednesday
3 1 Friday
4 2 Monday
5 2 Wednesday
1 1 Monday
2 1 Wednesday
3 1 Friday
4 2 Monday
5 2 Wednesday
如果我在列UNIQUE
中添加约束event_id
,则事件1仅具有星期一值,但我希望其余值包括星期三和星期五。如何添加约束来解决这个问题?
答案 0 :(得分:1)
您需要event_id
和 day
上的唯一索引:
create unique index idx_recurrence_event_day on recurrence(event_id, day)
这样可以防止您不想要的重复。
如果您已经有重复项,有多种方法可以摆脱它们。但是,如果每行有一个唯一的id会更容易,这就是为什么自动递增的主键在所有表中都有用的一个原因。
即使没有唯一ID,摆脱它们的一种方法是使用:
alter ignore table recurrence add unique (event_id, day);
就个人而言,我不喜欢这种方法,因为添加索引不应该删除行,但这是一个有效的MySQL扩展。
答案 1 :(得分:0)
Mr. Linoff提供了right way但if you cant's modify your schema
,您还可以使用row subquery检查insert
:
insert into table_name
select 1, 2, 'Monday' from dual
where (1,2, 'Monday') not in
(select id,event_id, day from table_name);
或使用where not exists
insert into table_name
select 1, 2, 'Monday' from dual
where not exists
(select 1,2, 'Monday' from table_name);