Я использую 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-оператора?
] Вы можете сделать это в одной квадратной ведомости для существующих клиентов, 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);
]
[] Если ваш бизнес растет со скоростью, которая сделает "куда положить все деньги" вашей единственной реальной проблемой, большая часть ваших вставок будет для существующих клиентов. Таким образом, в большинстве случаев исключение не произойдет, и вы будете сделаны в одном заявлении. [
]] Не с регулярным заявлением, нет. [
] [] Все, что можно сделать, это обернуть функциональность в функцию PL/pgsql (или другой язык, но PL/pgsql кажется наиболее подходящим для этого), а затем просто вызвать эту функцию. Это означает, что в вашем приложении все равно будет только одно утверждение[
].Используйте сохраненные процедуры.
И даже если предположить, что вы не захотите использовать хранимые процедуры - существует максимум 3 команды, которые нужно выполнить, а не 4. Второе получение идентификатора бесполезно, как и "INSERT INTO... ВОЗВРАЩЕНИЕ".