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

时间:2015-03-29 22:51:48

标签: php mysql sql

我有一个表存储有关某些事件重现的值,例如,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仅具有星期一值,但我希望其余值包括星期三和星期五。如何添加约束来解决这个问题?

2 个答案:

答案 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 wayif 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);

SQLFIDDLE DEMO

或使用where not exists

insert into table_name
select 1, 2, 'Monday' from dual
where not exists
(select 1,2, 'Monday' from table_name);

SQLFIDDLE DEMO