防止数据库-mysql中的重复值


Prevent duplicate values in database - mysql

我有一个表,其中存储了一些事件的重复值,例如,具有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_idday:上的唯一索引

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演示