由于时间戳now(),Sql插入忽略不起作用

时间:2014-03-19 00:16:06

标签: php mysql sql

我正在尝试阻止像这样的重复条目

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'

3 个答案:

答案 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。你验证了吗?将其余三个值定义为唯一列。它可能会奏效。