Php 在MySQL表中设置唯一的列对

Php 在MySQL表中设置唯一的列对,php,mysql,Php,Mysql,我正在使用后端的php-MySQL进行项目工作。它有各种文章可供浏览,分类为不同的类别和一个用户登录系统。我最近添加了一个观察列表功能,使用户能够向其观察列表/仪表板添加文章我有以下表格 文章表格 物品id(int)主要唯一 cat(varchar)名称(varchar)子cat(varchar)说明(varchar)添加日期 用户表用户名(varchar)主要唯一lnamefname加入日期 .观察列表表格 物品id(int)用户名(varchar)日期 正如我们所看到的,监视列表表没有唯一

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

文章表格
物品id(int)主要唯一
cat(varchar)
名称(varchar)
子cat(varchar)
说明(varchar)
添加日期

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

.观察列表表格
物品id(int)
用户名(varchar)
日期

正如我们所看到的,监视列表表没有唯一的键
我想使(用户名+文章id)成为唯一的一对 因为对于每个用户名,都存在超过1个文章id,反之亦然
我只想插入删除行,而不需要更新它们
如何防止重复条目?
到目前为止,我一直在用php检查行数

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

mysql_num_rows() >1(not allowed to insert) 
这可以正常工作,但如果执行INSERT命令时出错,则会出现重复条目
如何防止它?
我正在使用phpmyadmin试试看

$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
like

INSERT IGNORE INTO watchlist
    (article-id, username)
VALUES
    ({article-id}, {username}),
确保将列用作
唯一的
约束。如果不使用,请按如下方式更改它们

ALTER TABLE `watchlist`
ADD UNIQUE INDEX `watchlist_unique`
(`username`,`article-id`);
您需要检查
至少
1
记录不大于
1

并尽量避免使用
mysql\u*
语句,因为整个
ext/mysql PHP
扩展提供了所有以前缀
mysql\u*
命名的函数,从
phpv5.5.0
开始正式弃用,并将在将来删除


您可以更好地使用另外两个
MySQL
扩展:
MySQLi
PDO_MySQL
,这两个扩展都可以用来代替
ext/MySQL

,您只需向表中添加一个唯一的键即可:

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。有关这两方面的更多信息,请参见。

您可以对用户名和文章id建立唯一索引:

ALTER TABLE watchlist ADD UNIQUE INDEX my_idx ( username, article-id);
则不允许重复插入


您还可以使用
INSERT-INTO。。。在重复密钥
语法中,使用给定的用户名、项目id对更新条目中的某些字段

你可以在这里找到答案:。如果你读了他的原始帖子,你的解决方案正是他所尝试的。他想要一份保险,以防他错误地将相同的详细信息插入他的数据库。@Sutandino你是否完全检查了我的ans?..我向他提供了不同的解决方案。我告诉他检查
=
,并使用
忽略
。参见itOkay,我错过了
=
处的
=/code>标志。至于
INSERT IGNORE
,您仍然需要添加
UNIQUE
约束,以告知DB哪些列被认为是唯一的。@Sutandiono感谢您的建议。我稍后将尝试探索MySQLi。但现在我更喜欢什么。检查行数或@ellie(创建唯一对)发布的答案。哪一个更好?需要注意的是,如果在此之前在
文章id
用户名
上定义了任何唯一索引,则必须将其删除,以允许此规则适用于重复密钥更新的
等情况