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

У меня есть 3 таблицы: стоматологи, группы и групповые ссылки.Многие стоматологи связываются со многими группами через таблицу 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 ]

20 голосов
/ 16 декабря 2011

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


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 попытается вставить строку в вашу таблицу, если она потерпит неудачу из-за ограничения ключа, она будет действовать так, как будто ничего не происходит.

5 голосов
/ 15 декабря 2011
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) просто для уверенности.

2 голосов
/ 15 декабря 2011

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

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'
    )
1 голос
/ 16 декабря 2011
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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...