防止在同一天重复的值

时间:2014-08-27 13:17:55

标签: php mysql

我正在尝试开发php简单脚本,可以输入如下记录:( mysql是我的数据库引擎)

id (auto increment, primary key)
StudentName
StudentNumber
ClassName
Grade
ScreeningDate (mm/dd/yyyy)

现在我需要的是防止在同一天输入StudentNumber,例如,如果其他用户已经输入了,则会显示一条消息:此号码已经为今天添加...

换句话说,我需要在插入之前,检查studentNumber是否存在,然后给出消息,否则,通常会添加行......因此,第二天,没关系,他们可以像昨天一样再次添加相同的studentNumber ......类似于PrimaryKey,但仅适用于今天!这怎么可能?

3 个答案:

答案 0 :(得分:1)

在(ScreeningDate,StudentNumber)上创建唯一的复合索引。然后,将重复项放入表中的INSERT操作将失败,并出现重复键错误。

您需要在PHP代码中检测此重复键情况,并将相应的消息返回给尝试插入dup的用户。 INSERT语句将返回错误。

或者,如果要更新行(如果已存在),则可以使用INSERT ... ON DUPLICATE KEY UPDATE。读这个。 http://dev.mysql.com/doc/refman/5.6/en/insert.html

要创建索引,请执行以下操作:

ALTER TABLE whatever ADD UNIQUE INDEX NoDailyDups (ScreeningDate, StudentNumber)

这种方法的优势在于它可以正常工作,无需显式表锁定,即使在非常繁忙的系统上也是如此。如果两个用户恰好竞争为特定学生和日插入第一个项目,其中一个将获胜而另一个将获得重复键错误。

另请注意,您的表略有非规范化 - 它包含略微冗余的数据。您可能想要创建另一个包含列StudentNumberStudentName的表,并将学生名称移出此表。

答案 1 :(得分:0)

选择在今天的日期获取指定的学号:

SELECT * FROM table WHERE StudentNumber = 123 AND DATE(ScreeningDate) = CURDATE()

如果返回任何行,则会在今天的日期记录此学号,否则您可以自由插入。 DATE函数提取日期的日期部分,即日期月份和年份

答案 2 :(得分:-1)

这可能效率不高,但您可以先获取当前日期的所有行:

SELECT StudentNumber, ScreeningDate FROM tablename WHERE StudentNumber = '22' AND ScreeningDate = 'mm/dd/yyyy';

如果上面的查询返回超过0行(通常是一行),请不要添加(插入查询)。