防止数据库中的重复,而不是ID列

时间:2014-10-02 09:41:09

标签: php html mysql sql mysqli

整个夏天我一直在使用Stack Overflow让我的网页项目上线,而且我已经受够了,所以我公开了它。但是我的鞋子上有一块小石头,我想修理一下。

我已经尝试了此处找到的所有INSERT IGNORE建议,以防止在ID(主列)之外的行中重复输入数据。我的网页是www.lostdots.com,我想阻止某人输入相同的域名两次,因为它会使数据库看起来不整洁。

我用过:

   PRIMARY KEY (id, namebox1))");
   foreach($form_data as $name=>$value)
   {
     mysql_query("ALTER TABLE $mysql_table ADD $name VARCHAR(255)");
    }
   mysql_query("INSERT IGNORE INTO 
       $mysql_table  (`DATESTAMP`, `TIME`, `IP`, `BROWSER`)
            VALUES ('".date("Y-m-d")."',
            '".date("G:i:s")."',

我了解到,通过将'namebox1'作为主键,它可以防止重复,并且'Insert ignore'将阻止报告错误。那么我做错了什么?我知道我应该已经进入了MySQLi,但我想一次过一座桥。任何想法GURUs?

感谢, 阿拉斯泰尔

2 个答案:

答案 0 :(得分:0)

只需在列上设置唯一索引。

如果你有PHPMyAdmin,只需点击你想要设置唯一的列下的“唯一”。您可以在目标表的“结构”概览下找到该按钮。

如果您没有PHPMyAdmin,您可以通过使用原始查询更改架构来解决此问题:

ALTER TABLE `table_name` ADD UNIQUE (`column_name`);

瞧,你已经完成了。 MySQL不会接受目标列中的任何进一步重复值。

当然,如果你试图插入一个重复值mysql,你应该使用前缀选择通知a(“已经采用电子邮件”或者这个唯一索引用于的函数)来验证你的插入函数并生成一个自定义错误消息会抛出一个错误,这会让你和用户感到困惑,特别是如果你使用

这样的结构
$result = mysql_query(...);
if($result == false) die("An error occured");

请注意,只有在给出索引所需的完整性时才会起作用,这几乎意味着:此时表中必须没有重复值,否则您无法设置索引。如果表中已经有重复数据,您应该考虑是否可以删除数据或手动更改所有键。

(请记住,如果列设置为可空(它包含NULL值),则该值可能总是多次出现,而不管索引告诉的是什么。)

最后要提到的是:mysql_query是一个已弃用的库,将来会被删除。请考虑升级到更多保存,更高效且更易于处理的库http://php.net/manual/en/book.mysqli.phphttp://php.net/manual/en/book.pdo.php

答案 1 :(得分:0)

使您的domain_name列为UNIQUE。

为了更好:请尝试从域名表中选择数据。如果行计数大于0,那么这个平均域名已经存在于表中。 如果没有,那么插入。

所以请同时使用UNIQUE和select查询。