Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
 Аватар для narioz
1 / 1 / 0
Регистрация: 19.02.2012
Сообщений: 63

INSERT, вложенный в INSERT

06.03.2014, 09:55. Показов 3510. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Господа формучане, доброго времени суток.

У меня мало опыта работы с реляционными БД, посему прошу помощи у вас. У меня такая проблема:

есть база данных для службы такси. В этой БД есть таблицы car, model, vendor

SQL Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE vendor (
id SERIAL PRIMARY KEY,
name VARCHAR (32) NOT NULL
) WITH ( OIDS = FALSE );
 
CREATE TABLE model (
id SERIAL PRIMARY KEY,
vendor_id INT REFERENCES vendor (id) NOT NULL,
name VARCHAR (32) NOT NULL
) WITH ( OIDS = FALSE );
 
CREATE TABLE car (
id SERIAL PRIMARY KEY,
gov_num VARCHAR (15) UNIQUE NOT NULL,
model_id INT REFERENCES model (id) NOT NULL,
color COLOR
) WITH ( OIDS = FALSE );
Как организовать INSERT в таблицу car с одновременным добавление в model? Просто если сначала добавлять в model, а потом в car, то где то нужно хранить id того model, который был только что добавлен. Я пытался сделать как то так:
SQL Скопировано
1
2
3
INSERT INTO car (gov_num, model_id, color) VALUES ('nn555a', (
INSERT INTO "model" (vendor_id, "name") VALUES (3, "Mark II") RETURNING id
), 'black');
Но так не работает.
ERROR: syntax error at or near "INTO"
LINE 2: INSERT INTO "model" (vendor_id, "name") VALUES (3, "Mark II"...
^


********** Error **********

ERROR: syntax error at or near "INTO"
SQL state: 42601
Character: 71

Прошу вашей помощи, заранее благодарен!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2014, 09:55
Ответы с готовыми решениями:

Insert trigger
дано задание: Данный триггер срабатывает на добавления цены в таблице «рыба-экземпляр», он срабатывает после добавления. Описание: в случае...

Запрос с INSERT
Нужно написать запрос добавления данных в таблицу с полями per_saldo_flat_id,lc_id,date_id ,sal_begin,sal_calc ...

Insert values
Заранее признателен за помощь всем откликнувшимся. Есть три таблицы: 1.Ресторан 2.Категория 3. Подкатегория Происходит миграция...

5
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
06.03.2014, 10:25
Не работал с Postgre, но вообще INSERT-ы делаются именно отдельно. Никаких вложенных INSERT я не видел
0
 Аватар для narioz
1 / 1 / 0
Регистрация: 19.02.2012
Сообщений: 63
06.03.2014, 11:00  [ТС]
А как тогда организовать это на уровне базы данных?

По отдельности эти запросы выглядят так:

SQL Скопировано
1
INSERT INTO "model" (vendor_id, "name") VALUES (3, "Mark II") RETURNING id;
- должно вернуть, например, 5
SQL Скопировано
1
INSERT INTO car (gov_num, model_id, color) VALUES ('nn555a', 5, 'black');
и тут это 5 вставить

как быть?
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
06.03.2014, 11:48
В Oracle это организуется через применение PL/SQL, где есть возможность сохранять значение в переменной
0
1258 / 973 / 383
Регистрация: 02.09.2012
Сообщений: 3,001
06.03.2014, 17:24
Аналогично в PostgreSQL есть pgplsql и хранимые процедуры, плюс транзакции. Этими инструментами нормально реализуется то, что вы хотите.
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
08.03.2014, 12:18
Лучший ответ Сообщение было отмечено narioz как решение

Решение

SQL Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DO $$
    
    DECLARE lastId INTEGER = 0;
BEGIN
 
    -- Что бы не нарушать ограничение на 3
    INSERT INTO vendor ( "name" )
    VALUES ( '123' ), ( '123' ), ( '123' ), ( '123' );
    
    INSERT INTO model (vendor_id, "name") 
    VALUES (3, 'Mark II') RETURNING id INTO lastId;
 
    INSERT INTO car (gov_num, model_id) 
    VALUES ('nn555a', lastId);
 
END $$
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.03.2014, 12:18
Помогаю со студенческими работами здесь

GRANT INSERT
Добрый день! Скажите, пожалуйста, в чем заключается магия? Если дать разрешение пользователю на UPDATE, DELETE или просто вместо этого...

INSERT, подзапрос и VALUES
Подскажите пожалуйста, вот чтобы добавить данные из таблиц работает такой запрос INSERT INTO metric_values(mv_db_id, mv_cat_id) ...

Insert, delete, update
Доброго времени суток. Возник такой вопрос - как правильно производить операции вставки, удаления и обновления таблицы. Пишу программу...

Запрос INSERT IGNORE INTO
Пытаюсь сделать так, что бы запрос INSERT не добавлял строки с одинаковыми данными. Наткнулся на такую команду как IGNORE. Почитал, вроде...

Insert многомерного массива
Добрый вечер. Товарищи, подскажите, есть ли какая либо возможность инсерта в таблицу такого массива: }, { idReq: 2, idUser: }, {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер