2009-11-10 4 views
3

Предположим, у меня есть две таблицы, A и B, каждая из которых содержит три столбца (A.id, A.title, A.text и B.id, B.a_id, B.text). B.a_id - это внешний ключ, относящийся к A.id. Предположим, что в A (1, 'foo', 'bar') есть одна запись и 2 записи в B (1, 1, 'test') и (2, 1, 'test1').Копирование нескольких записей с использованием внешних ключей

Мой вопрос в том, есть ли стандартный способ копирования записи в A и в то же время копировать все записи из B, которые относятся к A. Поэтому предположим, что я создаю новую запись в A (2, foo ',' bar '), основанный на (1,' foo ',' bar '), есть какой-то метод, который создает две новые записи в B (3, 2,' test ') и (4, 2, «test1)?

Я никогда не использовал триггеры раньше, это правильный момент, чтобы начать делать это? Или это очень глупый вопрос?

ответ

4

Это не глупый вопрос. Однако я считаю, что это невозможно с чистым SQL или только с некоторым экзотическим синтаксисом, о котором я не знаю. Копирование строк не проблема (если предположить, что идентификатор является auto_increment):

insert into A (title, text) select title, text from A where id = XY 

Однако, то вам нужно найти последнюю вставку ID дублировать записи в Б. Давайте посмотрим:

insert into B (a_id, text) select LAST_INSERT_ID(), text from B where a_id = XY 

Hm ... возможно, это работает, но я немного скептически отношусь к LAST_INSERT_ID(). Во всяком случае, я не думаю, что это можно сделать только с одним заявлением.

Позвольте мне знать, как она идет

Том

+0

Отлично, это работает! Благодаря! Это уже проще, чем метод, который я использовал (используя отдельные запросы выбора и вставки). –

+0

Прохладный. Я никогда не использовал эту комбинированную вставку ... выбрать синтаксис раньше. Спасибо, что дали мне знать. –

+0

Это работает даже тогда, когда другие процессы обновляют таблицы, потому что '' LAST_INSERT_ID() '' смотрит на идентификатор, вставленный текущим процессом, и игнорирует идентификаторы, вставленные другими процессами. – kmoser

Смежные вопросы