SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.02.2011 15:26:09

outblaze
Участник
Зарегистрирован: 07.02.2011
Сообщений: 2

Подавить проверку целостности при вставке многострочным insert

приветствую
народ, такой вот вопрос возник, в мануале и гугле не нашёл, собственно что нужно:
Мы знаем, что если при вставке в таблицу, в инструкции insert указать ключевое слово ignore, то вставляемые записи, для которых не выполняется требование, например уникальности ключа, попросту не будут вставлены и mysql перейдёт к вставке новой записи.
Собственно, как добиться аналогичного поведения (без дополнительных выборок, триггеров и т. д.) для случая, когда между таблицами установлены отношения с внешними ключаеми, и вставляются сразу несколько строк т.е.:

master_tbl {id, val}
slave_tbl {master_id, descr}

и для slave_table задан ФК:

FOREIGN KEY (master_id) REFERENCES master_tbl (id) ON ...

Если мы вставляем в slave_tbl запись с master_id, для которого не выполняется условие по FK, то соответственно получаем ошибку "Cannot add or update a child row: a foreign key constraint fails..."

Имеется ли какой-то способ просто подавить возникновение этой ошибки и продолжить вставку со следуюшщей строки, в случае многострочного insert ? Например, первый блок:


# первый
insert ignore into slave_table (master_id, descr)
values
  (1, 'descr 1'),
  (2, 'descr 2'),
  (3, 'descr 3');

# второй

insert ignore into slave_table (master_id, descr)
values
  (4, 'descr 4'),
  (1000, 'descr 1000'),   # записи с id = 1000 в master_table нет, и вылетим по этой ошибке
  (5, 'descr 5');
 


Нужно, что бы строка со значением  (1000, 'descr 1000') при второй вставке, была просто проигнорирована, и вставка продолжилось начиная со следующей строки (то есть, будет вставлено (5, 'descr 5')

В данном случае, я не хотел бы использовать вложенные подзапросы, предварительные выборки (для проверки существования строки с конкретными id в мастере), триггеры, и даже LOAD DATA INFILE, и обойтись просто синтаксической конструкцией MySQL, если таковая имеется, и я о ней к сожалению не знал...

спасибо.

UP: MySQL 5.0.x

Отредактированно outblaze (28.02.2011 15:33:26)

Неактивен

 

#2 28.02.2011 17:37:06

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Подавить проверку целостности при вставке многострочным insert

К сожалению, единственная синтаксическая конструкция — INSERT IGNORE.

Самый простой вариант решения, который я вижу, — использовать триггер,
который бы всем «плохим» записям ставил в сопоставление уже существу-
ющий primary key (чтобы они отваливались на IGNORE и при этом не убива-
ли весь запрос).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson