Вставить, где не существует - без первичного ключа

У меня есть 3 таблицы: стоматологи, группы и groupdentlink. Многие стоматологи связываются со многими группами через таблицу groupdentlink.

Поэтому я пытаюсь сделать запрос, в котором он будет вставлять строки в groupdentlink (связывая всех дантистов в состоянии со всеми группами в состоянии), но только если эти строки еще не существуют. Короче говоря, я хочу добавить новые строки без перезаписи существующих или их дублирования.

Таким образом, цель запроса примерно такая:

INSERT INTO groupdentlink (f_dent_id, f_group_id, f_schedule_id)
VALUES ('$_POST[id]', '$groupid', '$scheduleid')
WHERE NOT EXISTS ('$_POST[id]', '$groupid')

И у меня нет никаких первичных ключей в таблице groupdentlink.

Заранее спасибо!

4 ответа

Решение

Если вы действительно хотите написать свой (рабочий) запрос..


INSERT INTO groupdentlink (
  f_dent_id, f_group_id, f_schedule_id
) SELECT 
    '$_POST[id]'  f_dent_id, 
    '$groupid'    f_group_id,
    '$scheduleid' f_schedule_id
FROM DUAL
WHERE NOT EXISTS (
  SELECT 1
  FROM `groupdentlink`
  WHERE 
    f_dent_id = '$_POST[id]' AND f_group_id = '$groupid'
  LIMIT 1 -- will stop mysql to stop searching after first match
)

... но MySQL может справиться со всем этим для вас!


Вам не нужны первичные ключи, чтобы MySQL справился с этим за вас, вы должны добавить UNIQUE ключевое ограничение на объединенный набор из двух столбцов.

Запрос на добавление уникального ключа dent_group_uniq_key в groupdentlink,

ALTER TABLE groupdentlink ADD UNIQUE KEY `dent_group_uniq_key` (
  f_dent_id, f_group_id
);

Тогда используйте INSERT IGNORE по вашему запросу:

INSERT IGNORE INTO groupdentlink (
  f_dent_id, f_group_id, f_schedule_id
) VALUES (
  '$_POST[id]', '$groupid', '$scheduleid'
)

INSERT IGNORE попытается вставить строку в вашу таблицу, если она потерпит неудачу из-за ключевого ограничения, она будет действовать так, как будто ничего не произошло.

INSERT INTO groupdentlink (f_dent_id, f_group_id, f_schedule_id)
SELECT '$_POST[id]', '$groupid', '$scheduleid' FROM dual
WHERE NOT EXISTS (
  select * from groupdentlink 
  where f_dent_id='$_POST[id]'
  and f_group_id='$groupid'
)

И я думаю, что вы можете создать составной первичный ключ для комбинации (f_dent_id, f_group_id) просто чтобы убедиться.

Вы почти получили это! Вы можете использовать оператор выбора для подачи оператора вставки. Просто сделай это:

INSERT INTO groupdentlink (f_dent_id, f_group_id, f_schedule_id)
SELECT '$_POST[id]', '$groupid', '$scheduleid'
WHERE 
    NOT EXISTS (
    select 
        1 
    from 
        groupdentlink 
    where 
        f_dent_id = $_POST[id] 
        and f_group_id = '$groupid'
    )
INSERT INTO groupdentlink (f_dent_id, f_group_id, f_schedule_id)
VALUES ('$_POST[id]', '$groupid', '$scheduleid')
WHERE NOT EXISTS (
  select * from groupdentlink 
  where f_dent_id='$_POST[id]'
  and f_group_id='$groupid'
)

И я думаю, что вы можете создать составной первичный ключ на комбинации (f_dent_id, f_group_id).

Другие вопросы по тегам