php - 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 个查询。
会有仁慈的灵魂来帮助我吗?
解决方案
首先,从您的数据结构来看,这似乎(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) 访问权限。
推荐阅读
- python - 绘制具有不同功能的分岔图
- verilog - casez 语句中“=”附近的 Verilog 语法错误
- docker - 将图像推送到 docker 时出错。请求的资源访问被拒绝
- java - 如何让这个地图生成器更高效?
- android - 如何查看我的 AVD 数据库的内容?
- python - 熊猫:使用日期时间索引将熊猫系列 n 行切片到过去
- python - 运行相同的代码,但使用两个不同的数据集(输入)
- reactjs - 模态触发器 - 鼠标位置
- python - locateAllOnScreen 多次找到同一张图片
- javascript - Vue3如何将道具发送到创建的子组件