MySQL вставлять не повторяющиеся множественные значения для каждого ключа

#php #mysql

#php #mysql

Вопрос:

уже поздно, мой ребенок плакал весь день, и ожидается, что я справлюсь с этим в течение следующих 3 часов. У меня есть 3 таблицы MySQL «сущности», «пользователи», «привилегии» (все имеют свой идентификатор в качестве ключа).

Таблица «привилегии» содержит следующие столбцы: id (ПЕРВИЧНЫЙ КЛЮЧ), user_id, entity_id, priviledge

Дело в том, что когда…

Я предоставляю пользователю наивысшую привилегию (3). система должна создать новые записи таблицы для всех оставшихся объектов (как только вы станете «администратором» для одного объекта, вы должны быть «администратором» для всех объектов; если у вас уже должна быть привилегия (2) для какого-либо объекта, ее следует изменить на 3).

Я не могу изменить структуру SQL, и я использую PHP с PDO. Я пытался, но у меня всегда получаются повторяющиеся записи в «привилегиях», поскольку я не могу использовать INSERT IGNORE (да, все еще SQL noob).

Прямо сейчас я просто выбираю всех пользователей с привилегиями.priviledge (3), затем я выбираю все РАЗЛИЧНЫЕ entities.id и сбрасывает их в массивы PHP, а затем я перебираю каждый «пользователь» и «объект». Поэтому вместо отправки 1 запроса я заканчиваю с USERSxENTITIES и сразу же отправляю более 500 запросов.

Найдется ли милосердная душа, которая поможет мне?

Ответ №1:

Сначала из вашей структуры данных кажется, что (user_id, entity_id) это должно быть уникальным.

Из-за ваших критериев «без изменений схемы таблицы» (в противном случае я бы удалил id (предполагается, что это auto_increment ) и добавил это в качестве первичного ключа), поэтому вместо этого создайте уникальный индекс:

 CREATE UNIQUE INDEX uniq_u_e ON priviledges (user_id, entity_id)
  

У вас, вероятно, уже есть дубликаты, поэтому найдите существующие вопросы для удаления дубликатов, а затем добавьте этот индекс.

Я предполагаю, что у вас есть другая таблица сущностей.

Создать пользователя admin (3) для всех объектов, у которых есть id в качестве первичного ключа объекта.

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

Таким образом, это гарантирует, что пользователь 42 имеет доступ администратора (3) ко всем объектам.

Комментарии:

1. Добро пожаловать, несмотря на ваше отчаяние, вы задали следующий вопрос. Я рад спасти ваш день с небольшим количеством сочувствия. Я рад, что вы кое-что узнали. Пожалуйста, позаботьтесь о себе.