3

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

文章
article-id(int) Primary-Unique
cat(varchar)
name(varchar)
subCat(varchar)
description(varchar)
添加日期

users
username(varchar) Primary-Unique
lname
fname join
-date

监视列表
article-id(int) username
(varchar) date_watch


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

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

而如果

mysql_num_rows() >1(not allowed to insert) 

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

4

3 回答 3

8

您可以简单地向表中添加一个唯一键:

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" 与 "INSERT ... ON DUPLICATE KEY UPDATE"

于 2013-08-23T05:28:58.227 回答
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
}

或者干脆使用IGNORElike

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扩展:MySQLiPDO_MySQL,其中任何一个都可以用来代替ext/mysql.

于 2013-08-23T05:23:28.023 回答
0

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

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

然后不允许重复插入。

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

于 2013-08-23T05:30:28.487 回答