【问题标题】:Creating Unique Key in MySQL table referring to date在 MySQL 表中创建引用日期的唯一键
【发布时间】:2010-07-13 09:55:09
【问题描述】:

关于防止在我的简单网络表单中重复输入的问题。

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

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    你的桌子应该有这些:

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

    【讨论】:

    • 感谢所有建议 :) 按照建议尝试,它将阻止同一日期的相同条目。但是当我将日期更改为下一个日期时,它会显示“重复名称”无法输入记录。如何让相同的名字可以在另一个DATE再次输入?
    • 也许你也有一个唯一的名字键?请运行:show create table tablename 并发布结果。
    • 谢谢大家,我设法让它运行起来。我输入了一个 if..else 语句来验证是否有任何 DATE 和 NAME 相同的行,然后不执行输入记录,否则,输入记录。我从你们所有人那里得到了使 NAME 和 DATE 独一无二的想法。感谢! :)
    【解决方案2】:

    您可以简单地创建复合主键。对于您的情况,这意味着您的主键必须由日期字段和用户名字段组成。

    【讨论】:

    • 这也是可能的。但是在创建与该表的关系时,复合 PK 存在问题。我认为 UNIQUE 索引是更好的方法。
    • 我同意!但是,我只想指出,唯一字段的“NOT NULL”选项是必需的(就像您在表创建代码中所做的那样),因为名称或日期的 NULL 值会破坏唯一性(即可以添加如果日期为 NULL,则用户 'xxx' 多次)。
    【解决方案3】:

    以多种方式。

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

    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 方式 :))。

    【讨论】:

      【解决方案4】:

      在用户和日期列上创建唯一键

      http://dev.mysql.com/doc/refman/5.1/en/create-table.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多