我使用的是PostgreSQL9.3,并且我试图编写一个SQL脚本来为单元测试插入一些数据,但是我遇到了一些问题.
假设我们有三张桌子, struct 如下:
------- Table A ------- -------- Table B -------- -------- Table C --------
id | serial NOT NULL id | serial NOT NULL id | serial NOT NULL
foo | character varying a_id | integer NOT NULL b_id | integer NOT NULL
bar | character varying baz | character varying
列B.a_id
和C.b_id
分别是表A
和B
的id
列的外键.
我要做的是用纯SQL将一行插入到这三个表中,而不将ID硬编码到SQL中(在运行此脚本之前对数据库进行假设似乎是不可取的,因为如果这些假设发生变化,我将不得不返回并重新计算所有测试数据的正确ID).
请注意,我确实意识到我可以通过编程实现这一点,但一般来说,编写纯SQL比编写程序代码来执行SQL要简单得多,因此它对测试套件数据更有意义.
无论如何,下面是我编写的查询,我认为它会起作用:
WITH X AS (
WITH Y AS (
INSERT INTO A (foo)
VALUES ('abc')
RETURNING id
)
INSERT INTO B (a_id, bar)
SELECT id, 'def'
FROM Y
RETURNING id
)
INSERT INTO C (b_id, baz)
SELECT id, 'ghi'
FROM X;
然而,这不起作用,导致PostgreSQL告诉我:
ERROR: WITH clause containing a data-modifying statement must be at the top level
通常有没有一种正确的方式来编写这种类型的查询,而不对ID值进行硬编码?
(您可以找到包含此示例的小提琴here.)