我有一个表,其中存储了一些事件的重复值,例如,具有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
如果我在列event_id
中添加约束UNIQUE
,则事件1只有值Monday,但我希望它具有其他值,如周三和周五。如何添加约束来解决此问题?
您想要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扩展。
Mr。Linoff提供了正确的方法,但if you cant's modify your schema
,您也可以使用行子查询检查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);
SQLFIDDLE演示
或使用where not exists
insert into table_name
select 1, 2, 'Monday' from dual
where not exists
(select 1,2, 'Monday' from table_name);
SQLFIDDLE演示