将数据插入到通过外键链接的表中

我正在使用PostgreSQL。

Customer ================== Customer_ID | Name Order ============================== Order_ID | Customer_ID | Price 

为了插入一个命令,这里是我通常需要做的事情,

例如,“约翰”放置“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语句来实现?

你可以在一个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 

(提供您使customer_id不可为空,我相信你做了)。 发生该exception时,将客户插入客户表,然后将该插入重新插入到订单表中:

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

除非您的业务正在以“将所有资金放在哪里”的速度增长,否则您的唯一真正的问题是,您的大部分插入将是针对现有客户的。 所以,大多数情况下,这个例外不会发生,你会在一个声明中完成。

没有正式的声明,没有。

你可以做的是将function封装在PL / pgsql函数(或其他语言,但PL / pgsql似乎是最合适的),然后调用该函数。 这意味着它仍然是您的应用程序的一个单一的声明。

使用存储过程。

甚至假设你不想使用存储过程 – 最多只能运行3个命令,而不是4个。第二个获得id是无用的,就像你可以做“INSERT INTO … RETURNING”一样。

创build一个视图,并通过一个视图插入。

请参阅https://msdn.microsoft.com/en-us/library/ms180800.aspx