在MySQL表中设置唯一的列对

时间:2013-08-23 05:21:05

标签: php mysql

我正在后端使用 php-MySQL 进行项目。它有各种文章可供浏览,分类为各种类别用户登录系统。
我最近添加了一个观看列表功能,使用户能够将文章添加到他们的观察列表/仪表板
我有以下表格。

  

文章表   
article-id(int)Primary-Unique   
cat(varchar)
名称(varchar)
subCat(varchar)
描述(varchar)
添加日期

  用户
用户名(varchar)主要唯一
lname
fname
加入日期

  。关注列表表   
文章ID(INT)
用户名(为varchar)
date_watch   

我们可以看到手表列表没有唯一的密钥
我想让(用户名+文章ID)成为唯一一对 因为对于每个用户名,存在超过1个文章ID并且反之亦然
我只想插入删除行,不需要更新他们如何阻止重复的条目?
 到现在为止我一直用php检查行数

"SELECT * FROM watchlist WHERE article-id={$id} AND username={$user}"

如果

mysql_num_rows() >1(not allowed to insert) 

这样可以正常但如果错误地执行了INSERT命令,那将是一个重复的条目
如何防止它?
我正在使用 phpmyadmin

3 个答案:

答案 0 :(得分:5)

您只需在表格中添加一个唯一键:

ALTER TABLE `watchlist`
ADD UNIQUE INDEX `watchlist_unique` (`article-id`, `username`);

此外,通过查看您所拥有的功能,您可以选择将其设置为主键,而不是使用以上内容:

ALTER TABLE `watchlist`
ADD PRIMARY KEY (`article-id`, `username`);

两者都会阻止任何重复条目的插入。

此外,如果您想在这种情况下插入,您可能需要检查INSERT IGNORE和ON DUPLICATE KEY。有关两者的详细信息,请参阅"INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"

答案 1 :(得分:1)

尝试

$sql =  "SELECT * FROM watchlist WHERE article-id={$id} AND username={$user}";
if(mysql_num_rows($sql) >=1) {
     //Prevent Insert 
} else {
     //Put your Insert query
}

或者只使用IGNORE之类的

INSERT IGNORE INTO watchlist
    (article-id, username)
VALUES
    ({article-id}, {username}),

确保您将列用作UNIQUE约束。如果不将它们更改为

ALTER TABLE `watchlist`
ADD UNIQUE INDEX `watchlist_unique`
(`username`,`article-id`);

您需要检查atleast1记录的1不大于mysql_*

并且由于整个ext/mysql PHP扩展程序(提供带有前缀mysql_*命名的所有函数)从PHP v5.5.0开始正式弃用,并尝试避免MySQL语句将来删除

您可以更好地使用其他两个MySQLi扩展程序:PDO_MySQLext/mysql,其中任何一个都可以用来代替{{1}}。

答案 2 :(得分:0)

您可以在用户名和文章ID上创建唯一索引:

ALTER TABLE watchlist ADD UNIQUE INDEX my_idx ( username, article-id);

然后不允许重复插入。

您还可以使用INSERT INTO ... ON DUPLICATE KEY语法正常处理重复插入,以使用给定的用户名,文章ID对更新条目中的某些字段。