我正在尝试阻止像这样的重复条目
INSERT IGNORE INTO myTable( `val_1`, `val_2`, `val_3`, `date` )
VALUES ( '$var_1', '$var_2', '$var_3', now() )
我要检查的值是3 val_x
,但由于now()
将是唯一值,因此插入忽略不起作用。
我怎样才能将最后一个变量检查为唯一?
注意:这有点像购物车,所以我不能让前3个值独一无二。会话变量允许每个用户查看唯一的集合。
从该图中,前两行是重复的,因为它们属于同一个用户会话。第3行不重复,因为它属于不同的用户会话
+---------+-------+--------+
| session | var 1 | var 2 |
+---------+-------+--------+
| abc1234 | aaaaa | bbbbb |
+---------+-------+--------+
| abc1234 | aaaaa | bbbbb |
+---------+-------+--------+
| 5678def | aaaaa | bbbbb |
+---------+-------+--------+
| 5678def | aaaaa | ccccc |
+---------+-------+--------+
正如paqogomez建议我从查询中删除now()
并更改了表,但看起来我需要insert ignore
的主键才能工作,但对于我的方案,我不能使这3列唯一< / p>
ERROR 1062: Duplicate entry 'aaaaa' for key 'var 1'
答案 0 :(得分:2)
在前三列创建唯一索引:
create unique index myTable_session_val2_val3 on myTable(session, val_1, val_2);
这将保证这三者的组合是唯一的,而不考虑任何其他列。
答案 1 :(得分:2)
我建议将日期移动到列的默认值。
ALTER TABLE mytable CHANGE `date` `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
这样,您仍然可以处理PHP中数据的重复项。如其他人所建议的那样,如果您尝试插入副本,则会导致数据库外键错误。
然后这个sql会工作并给出相同的结果:
INSERT IGNORE INTO myTable( `val_1`, `val_2`, `val_3` )
VALUES ( '$var_1', '$var_2', '$var_3' )
编辑:
您仍需要一个唯一索引才能使其正常工作。请参阅@ Gordon的回答
答案 2 :(得分:1)
您可能应该为不希望重复的列组合定义UNIQUE
个键。因此,请勿将列日期指定为UNIQUE
。你验证了吗?将其余三个值定义为唯一列。它可能会奏效。