mysql - 避免在 mysql 插入中重复

标签 mysql

我有一个 friend 表,其中包含“id”、“friend (INTEGER)”和“user (INTEGER)”字段。

用户与好友之间存在好友关系。 即

id     user     friend

6       22        45

7       45        22

是同一个好友关系,应该算是重复记录。

我想一次输入一大堆记录,所以像这样:

INSERT INTO friends (user, friend) VALUES(22, 34), (22, 76), (22, 567)...;

在这种情况下,我可以轻松地使用 IGNORE 来避免输入重复的 (22, 34) 条目(如果 (22, 34) 已经存在),但是有没有一种方法我也可以避免输入 (22, 34) 如果(34, 22) 已经存在,因为这是相同的关系。

最佳答案

对每对进行排序;然后执行 INSERT IGNORE 以避免错误消息。

插入时可以排序

INSERT IGNORE INTO tbl (a,b) VALUES (LEAST($a, $b), GREATEST($a, $b));

但是,为了进行批量插入,您可能应该使用客户端语言进行排序。

另一个问题:INSERT IGNORE 将在检查 dup 之前创建一个 id。因此,许多 AUTO_INCREMENT 值将被“销毁”。

与其解释如何避免燃烧,不如说id 似乎没有充分的理由。而是有

PRIMARY KEY(user_id, friend_id)

排序的另一个问题......SELECT 可能需要做一个UNION:

( SELECT ... WHERE user_id = $x )
UNION ALL
( SELECT ... WHERE friend_id = $x )

这意味着您也需要这个:

INDEX(friend_id, user_id)

关于mysql - 避免在 mysql 插入中重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29456570/

相关文章:

mysql - 如何使用 phpMyAdmin 和外键制作音乐库?

基于指定表列的 SQL 外键

php - 看看是否过了30分钟?

mysql - SQL Case 不标记 null 时

php - 将 Yii ActiveRecord 模型插入 mysql 表时出错

mysql - 连接一个或另一个表的 SQL 查询

mysql - 如何使用 xampp 访问 MySQL 命令行?

mysql - 从一个查询获取查询结果并使用它来过滤下一个结果时存在一些 SQL 子查询问题

mysql - 为什么这个 mysql 查询无法根据它们的值返回某些行

php - 使用 PDO 将文本区域 $_POST 发送到 MySQL