2010-07-13 49 views
7

向所有人致以问候。新手在这里。关于防止在我的简单网页表单中重复输入的问题。在指定日期的MySQL表中创建唯一密钥

我的表格记录来自网络表格的用户输入,并按日期进行区分,例如,日期()。如何防止同名用户在同一日期输入两次信息,例如同一用户名不能在同一日期输入两次,但可以在其他日期输入?

希望有人能就此提出建议。感谢提前。

回答

9

你的表应该有这些:

create table tablename (
... 
user_id bigint, -- or whatever 
date_created date, 
unique key(user_id, date_created) 
... 
); 
+0

感谢您的所有建议:) 按照建议尝试,它会阻止同一日期的同一条目。但是当我将日期更改为下一个日期时,它会显示'重复名称'无法输入记录。如何在同一日期再次输入同一个NAME? – cys 2010-07-14 03:41:44

+0

也许你一个人的名字也有一个独特的关键? 请运行这个:'show create table tablename'并发布结果。 – ceteras 2010-07-14 09:00:55

+0

谢谢你,我设法让它运行。我放入一个if..else语句来验证DATE和NAME中是否有任何相同的行,然后不执行输入记录,否则输入记录。我从你们所有人那里获得了让NAME和DATE独一无二的想法。谢谢! :) – cys 2010-07-15 06:05:16

1

您可以简单的创建一个复合主键的唯一关键。对于你的情况,这意味着你的主键必须包含一个日期字段以及用户名字段。

+1

这也是可能的。但是,与该表格建立关系时,复合PKs存在问题。我认为UNIQUE指数是更好的方法。 – 2010-07-13 10:04:08

+0

我同意!不过,我只想说,唯一字段的“NOT NULL”选项是必需的(就像您在表创建代码中那样),因为名称或日期的NULL值破坏了唯一性(即可以添加如果日期为NULL,则用户'xxx'多次)。 – Javaguru 2010-07-13 10:20:11

1

以几种方式。

首先,您可以在表格上创建索引。 (我使用简单的表格作为例子)。

CREATE TABLE `test` (
`id` INT NOT NULL , 
`name` VARCHAR(255) NOT NULL , 
`date` DATE NOT NULL , 
PRIMARY KEY (`id`) 
) ENGINE = MYISAM; 

ALTER TABLE `test` ADD UNIQUE (
`name` , 
`date` 
); 

这是MySQL方式。

您还应该在PHP中进行检查,尽管您可以在插入时进行检查(MySQL将返回错误并且可以检查它)。但是在插入前(SELECT * from test WHERE name=USER AND date=DATE)并检查记录计数,您可以进行额外的SELECT。如果它大于0,则显示错误。

保存时,你很少应该担心一个额外的SQL。如果你应该,只需检查MySQL语句是否有错误(MySQL方式:))。