我正在尝试开发php简单脚本,可以输入如下记录:( mysql是我的数据库引擎)
id (auto increment, primary key)
StudentName
StudentNumber
ClassName
Grade
ScreeningDate (mm/dd/yyyy)
等
现在我需要的是防止在同一天输入StudentNumber,例如,如果其他用户已经输入了,则会显示一条消息:此号码已经为今天添加...
换句话说,我需要在插入之前,检查studentNumber是否存在,然后给出消息,否则,通常会添加行......因此,第二天,没关系,他们可以像昨天一样再次添加相同的studentNumber ......类似于PrimaryKey,但仅适用于今天!这怎么可能?
答案 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)
这种方法的优势在于它可以正常工作,无需显式表锁定,即使在非常繁忙的系统上也是如此。如果两个用户恰好竞争为特定学生和日插入第一个项目,其中一个将获胜而另一个将获得重复键错误。
另请注意,您的表略有非规范化 - 它包含略微冗余的数据。您可能想要创建另一个包含列StudentNumber
和StudentName
的表,并将学生名称移出此表。
答案 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行(通常是一行),请不要添加(插入查询)。