首页 > 解决方案 > MySQL为每个键插入不重复的多个值

问题描述

很晚了,我的孩子哭了一整天,预计我会在接下来的 3 小时内完成。我有 3 个 MySQL 表“实体”、“用户”、“特权”(都有他们的 id 作为键)。

表“priviledges”有这些列:id(PRIMARY KEY)、user_id、entity_id、priviledge

问题是,当...

我授予用户最高权限(3),系统应为所有剩余实体创建新表条目(一旦您成为一个实体的“管理员”,您应该成为所有实体的“管理员”;如果您应该拥有特权(2 ) 对于某些实体,应将其更改为 3)。

我无法更改 SQL 结构,我正在使用带有 PDO 的 PHP。我试过了,但我总是在“特权”中得到重复的条目,因为我无法使用 INSERT IGNORE(是的,仍然是 SQL noob)。

现在我只需选择所有具有 priviledges.priviledge(3) 的用户,然后选择所有 DISTINCT entity.id 并将它们转储到 PHP 数组中,然后循环遍历每个“用户”和“实体”。因此,我没有发送 1 个查询,而是以 USERSxENTITIES 结尾,现在它有超过 500 个查询。

会有仁慈的灵魂来帮助我吗?

标签: phpmysql

解决方案


首先,从您的数据结构来看,这似乎(user_id, entity_id)是独一无二的。

由于您的“无表架构更改”标准(否则我会删除 id (假设为 an auto_increment)并将其添加为主键),因此创建一个唯一索引:

CREATE UNIQUE INDEX uniq_u_e ON priviledges (user_id, entity_id)

您可能已经有重复项,因此请搜索现有问题以删除重复项,然后添加此索引。

我假设你有另一个实体表。

在所有具有id作为其实体主键的实体上创建一个管理员 (3) 用户。

INSERT INTO priviledges( user_id, entity_id, priviledge)
SELECT 42 as user_id, id, 3
FROM entities
ON DUPLICATE KEY
UPDATE priviledge = 3

因此,这确保了用户 42 对所有实体具有 admin(3) 访问权限。


推荐阅读