Множественный insert
Помогите пожалуйста построить запрос.
Есть база с 3 таблицами: люди, автомобили, связи людей с автомобилями (у каждого человека может быть много автомобилей)
create table peoples (
id integer primary key autoincrement,
fio text,
...
);
create table cars (
id integer primary key autoincrement,
car text,
...
);
create table relations (
id integer primary key autoincrement,
fio_id integer,
car_id integer
);
Есть ли способ за один запрос вставить: нового человека (в таблицу peoples) и сразу же привязать к нему автомобиль (в таблице relations)
По сути вопрос о том, как вставить id записи, которая только что создана.
Длинный способ:
- insert fio человека в таблицу peoples
- поиск id человека по fio в таблице peoples (потому что в следующем шаге нужен именно id)
- insert id человека и id автомобиля в таблицу relations
Может как-то проще можно? А может есть возможность сразу в три таблицы вставлять? (было бы вообще здорово)
Ответы (1 шт):
А может есть возможность сразу в три таблицы вставлять?
Нет. SQLite (да и все иные СУБД) поддерживают исключительно однотабличный INSERT. Некоторые СУБД (например, Постгресс) позволяют выполнять вставку в CTE - но SQLite к ним не относится. Так что увы, три таблицы - три INSERT.
А вот пункты 2 и 3 можно совместить в один запрос - используйте INSERT .. SELECT, a не INSERT .. VALUES:
INSERT INTO peoples (fio, ...)
VALUES ('Адам Казимирович Козлевич', ...)
ON CONFLICT (...) ...;
INSERT INTO cars (car, ...)
VALUES ('Антилопа Гну', ...)
ON CONFLICT (...) ...;
INSERT INTO relations (fio_id, car_id)
SELECT MAX(peoples.id), MAX(cars.id)
FROM peoples, cars
WHERE peoples.fio = 'Адам Казимирович Козлевич'
AND cars.car = 'Антилопа Гну';
MAX() позволяет выбрать последнюю вставленную запись при наличии полностью совпадающих ФИО и/или наименования машины. Либо для однозначного выбора в последнем запросе нужны дополнительные условия отбора - но следует гарантировать, что его SELECT-часть вернёт строго одну запись (в самом крайнем случае - добавить сортировку и LIMIT).