Вставить, где не существует - без первичного ключа
У меня есть 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).