Вставьте данные в таблицы, связанные внешним ключом

Я использую PostgreSQL.

Customer
==================
Customer_ID | Name

Order
==============================
Order_ID | Customer_ID | Price

Для вставки порядка вот то, что я должен обычно делать,

Например, место "John" "1.34" оцененный порядок.

(1) Get Customer_ID from Customer table, where name is "John"
(2) If there are no Customer_ID returned (There is no John), insert "John"
(3) Get Customer_ID from Customer table, where name is "John"
(4) Insert "Customer_ID" and "1.34" into Order table.

Существует 4 связи SQL с базой данных, включенной для этой простой операции!!!

Есть ли какой-либо лучший путь, который может быть достижимым использованием 1 SQL-оператора?

45
задан Cheok Yan Cheng 4 January 2010 в 08:42
поделиться

3 ответа

[

] Вы можете сделать это в одной квадратной ведомости для существующих клиентов, 3 ведомости для новых. Все, что вам нужно сделать, это быть оптимистом и вести себя так, как будто клиент уже существует: [

]. [
insert into "order" (customer_id, price) values \
((select customer_id from customer where name = 'John'), 12.34);
] [

] Если заказчик не существует, вы получите sql исключение, текст которого будет что-то вроде: [

]. [
null value in column "customer_id" violates not-null constraint
] [

] (при условии, что ты сделаешь клиента неуправляемым, что, я уверен, ты и сделал). При возникновении такого исключения вставьте заказчика в таблицу заказчика и повторите вставку в таблицу заказа:[

]. [
insert into customer(name) values ('John');
insert into "order" (customer_id, price) values \
((select customer_id from customer where name = 'John'), 12.34);
] [

] Если ваш бизнес растет со скоростью, которая сделает "куда положить все деньги" вашей единственной реальной проблемой, большая часть ваших вставок будет для существующих клиентов. Таким образом, в большинстве случаев исключение не произойдет, и вы будете сделаны в одном заявлении. [

]
53
ответ дан 26 November 2019 в 21:26
поделиться
[

] Не с регулярным заявлением, нет. [

] [

] Все, что можно сделать, это обернуть функциональность в функцию PL/pgsql (или другой язык, но PL/pgsql кажется наиболее подходящим для этого), а затем просто вызвать эту функцию. Это означает, что в вашем приложении все равно будет только одно утверждение[

].
3
ответ дан 26 November 2019 в 21:26
поделиться

Используйте сохраненные процедуры.

И даже если предположить, что вы не захотите использовать хранимые процедуры - существует максимум 3 команды, которые нужно выполнить, а не 4. Второе получение идентификатора бесполезно, как и "INSERT INTO... ВОЗВРАЩЕНИЕ".

1
ответ дан 26 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: