【问题标题】:Set Unique pair of columns in a MySQL table在 MySQL 表中设置唯一的列对
【发布时间】:2013-08-23 05:21:05
【问题描述】:

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

文章
article-id(int) 主要-唯一
cat(varchar)
name(varchar)
subCat(varchar)
description(varchar)
添加日期

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

.关注列表
article-id(int)
用户名(varchar)
date_watch

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

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

如果

mysql_num_rows() >1(not allowed to insert) 

这工作正常,但如果错误地执行了 INSERT 命令,将会出现重复条目​​
如何防止它?
我正在使用 phpmyadmin

【问题讨论】:

标签: php mysql


【解决方案1】:

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

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"

【讨论】:

  • 需要注意的一点是,如果在此之前在 article-idusername 上定义了任何唯一索引,则必须将其删除以允许此规则适用于诸如 ON DUPLICATE KEY UPDATE 之类的情况
【解决方案2】:

试试看

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

【讨论】:

  • 如果您阅读他的原始帖子,您的解决方案正是他所尝试的。他想要一份保险,以防他错误地将相同的详细信息插入到他的数据库中。
  • @Sutandiono 你有没有完全检查过我的回答...??我从他那里得到了差异解决方案。
  • 我已经告诉他与>= 核对并使用IGNORE..查看它
  • 好的,我错过了>= 处的= 标志。至于INSERT IGNORE,您仍然需要添加UNIQUE 约束,它告诉数据库哪些列被认为是唯一的。
  • @Sutandiono 感谢您的建议。我稍后会尝试探索 MySQLi。但现在我应该更喜欢什么。检查行数或@ellie 发布的答案(创建唯一对)。哪个更好?
【解决方案3】:

您可以对用户名和文章 ID 进行唯一索引:

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

那么不允许重复插入。

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

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多