returning.out

来自「postgresql8.3.4源码,开源数据库」· OUT 代码 · 共 335 行

OUT
335
字号
---- Test INSERT/UPDATE/DELETE RETURNING---- Simple casesCREATE TEMP TABLE foo (f1 serial, f2 text, f3 int default 42);NOTICE:  CREATE TABLE will create implicit sequence "foo_f1_seq" for serial column "foo.f1"INSERT INTO foo (f2,f3)  VALUES ('test', DEFAULT), ('More', 11), (upper('more'), 7+9)  RETURNING *, f1+f3 AS sum; f1 |  f2  | f3 | sum ----+------+----+-----  1 | test | 42 |  43  2 | More | 11 |  13  3 | MORE | 16 |  19(3 rows)SELECT * FROM foo; f1 |  f2  | f3 ----+------+----  1 | test | 42  2 | More | 11  3 | MORE | 16(3 rows)UPDATE foo SET f2 = lower(f2), f3 = DEFAULT RETURNING foo.*, f1+f3 AS sum13; f1 |  f2  | f3 | sum13 ----+------+----+-------  1 | test | 42 |    43  2 | more | 42 |    44  3 | more | 42 |    45(3 rows)SELECT * FROM foo; f1 |  f2  | f3 ----+------+----  1 | test | 42  2 | more | 42  3 | more | 42(3 rows)DELETE FROM foo WHERE f1 > 2 RETURNING f3, f2, f1, least(f1,f3); f3 |  f2  | f1 | least ----+------+----+------- 42 | more |  3 |     3(1 row)SELECT * FROM foo; f1 |  f2  | f3 ----+------+----  1 | test | 42  2 | more | 42(2 rows)-- Subplans and initplans in the RETURNING listINSERT INTO foo SELECT f1+10, f2, f3+99 FROM foo  RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan,    EXISTS(SELECT * FROM int4_tbl) AS initplan; f1 |  f2  | f3  | subplan | initplan ----+------+-----+---------+---------- 11 | test | 141 | t       | t 12 | more | 141 | f       | t(2 rows)UPDATE foo SET f3 = f3 * 2  WHERE f1 > 10  RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan,    EXISTS(SELECT * FROM int4_tbl) AS initplan; f1 |  f2  | f3  | subplan | initplan ----+------+-----+---------+---------- 11 | test | 282 | t       | t 12 | more | 282 | f       | t(2 rows)DELETE FROM foo  WHERE f1 > 10  RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan,    EXISTS(SELECT * FROM int4_tbl) AS initplan; f1 |  f2  | f3  | subplan | initplan ----+------+-----+---------+---------- 11 | test | 282 | t       | t 12 | more | 282 | f       | t(2 rows)-- JoinsUPDATE foo SET f3 = f3*2  FROM int4_tbl i  WHERE foo.f1 + 123455 = i.f1  RETURNING foo.*, i.f1 as "i.f1"; f1 |  f2  | f3 |  i.f1  ----+------+----+--------  1 | test | 84 | 123456(1 row)SELECT * FROM foo; f1 |  f2  | f3 ----+------+----  2 | more | 42  1 | test | 84(2 rows)DELETE FROM foo  USING int4_tbl i  WHERE foo.f1 + 123455 = i.f1  RETURNING foo.*, i.f1 as "i.f1"; f1 |  f2  | f3 |  i.f1  ----+------+----+--------  1 | test | 84 | 123456(1 row)SELECT * FROM foo; f1 |  f2  | f3 ----+------+----  2 | more | 42(1 row)-- Check inheritance casesCREATE TEMP TABLE foochild (fc int) INHERITS (foo);INSERT INTO foochild VALUES(123,'child',999,-123);ALTER TABLE foo ADD COLUMN f4 int8 DEFAULT 99;SELECT * FROM foo; f1  |  f2   | f3  | f4 -----+-------+-----+----   2 | more  |  42 | 99 123 | child | 999 | 99(2 rows)SELECT * FROM foochild; f1  |  f2   | f3  |  fc  | f4 -----+-------+-----+------+---- 123 | child | 999 | -123 | 99(1 row)UPDATE foo SET f4 = f4 + f3 WHERE f4 = 99 RETURNING *; f1  |  f2   | f3  |  f4  -----+-------+-----+------   2 | more  |  42 |  141 123 | child | 999 | 1098(2 rows)SELECT * FROM foo; f1  |  f2   | f3  |  f4  -----+-------+-----+------   2 | more  |  42 |  141 123 | child | 999 | 1098(2 rows)SELECT * FROM foochild; f1  |  f2   | f3  |  fc  |  f4  -----+-------+-----+------+------ 123 | child | 999 | -123 | 1098(1 row)UPDATE foo SET f3 = f3*2  FROM int8_tbl i  WHERE foo.f1 = i.q2  RETURNING *; f1  |  f2   |  f3  |  f4  |        q1        | q2  -----+-------+------+------+------------------+----- 123 | child | 1998 | 1098 | 4567890123456789 | 123(1 row)SELECT * FROM foo; f1  |  f2   |  f3  |  f4  -----+-------+------+------   2 | more  |   42 |  141 123 | child | 1998 | 1098(2 rows)SELECT * FROM foochild; f1  |  f2   |  f3  |  fc  |  f4  -----+-------+------+------+------ 123 | child | 1998 | -123 | 1098(1 row)DELETE FROM foo  USING int8_tbl i  WHERE foo.f1 = i.q2  RETURNING *; f1  |  f2   |  f3  |  f4  |        q1        | q2  -----+-------+------+------+------------------+----- 123 | child | 1998 | 1098 | 4567890123456789 | 123(1 row)SELECT * FROM foo; f1 |  f2  | f3 | f4  ----+------+----+-----  2 | more | 42 | 141(1 row)SELECT * FROM foochild; f1 | f2 | f3 | fc | f4 ----+----+----+----+----(0 rows)DROP TABLE foochild;-- Rules and viewsCREATE TEMP VIEW voo AS SELECT f1, f2 FROM foo;CREATE RULE voo_i AS ON INSERT TO voo DO INSTEAD  INSERT INTO foo VALUES(new.*, 57);INSERT INTO voo VALUES(11,'zit');-- fails:INSERT INTO voo VALUES(12,'zoo') RETURNING *, f1*2;ERROR:  cannot perform INSERT RETURNING on relation "voo"HINT:  You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause.-- fails, incompatible list:CREATE OR REPLACE RULE voo_i AS ON INSERT TO voo DO INSTEAD  INSERT INTO foo VALUES(new.*, 57) RETURNING *;ERROR:  RETURNING list has too many entriesCREATE OR REPLACE RULE voo_i AS ON INSERT TO voo DO INSTEAD  INSERT INTO foo VALUES(new.*, 57) RETURNING f1, f2;-- should still workINSERT INTO voo VALUES(13,'zit2');-- works nowINSERT INTO voo VALUES(14,'zoo2') RETURNING *; f1 |  f2  ----+------ 14 | zoo2(1 row)SELECT * FROM foo; f1 |  f2  | f3 | f4  ----+------+----+-----  2 | more | 42 | 141 11 | zit  | 57 |  99 13 | zit2 | 57 |  99 14 | zoo2 | 57 |  99(4 rows)SELECT * FROM voo; f1 |  f2  ----+------  2 | more 11 | zit 13 | zit2 14 | zoo2(4 rows)CREATE OR REPLACE RULE voo_u AS ON UPDATE TO voo DO INSTEAD  UPDATE foo SET f1 = new.f1, f2 = new.f2 WHERE f1 = old.f1  RETURNING f1, f2;update voo set f1 = f1 + 1 where f2 = 'zoo2';update voo set f1 = f1 + 1 where f2 = 'zoo2' RETURNING *, f1*2; f1 |  f2  | ?column? ----+------+---------- 16 | zoo2 |       32(1 row)SELECT * FROM foo; f1 |  f2  | f3 | f4  ----+------+----+-----  2 | more | 42 | 141 11 | zit  | 57 |  99 13 | zit2 | 57 |  99 16 | zoo2 | 57 |  99(4 rows)SELECT * FROM voo; f1 |  f2  ----+------  2 | more 11 | zit 13 | zit2 16 | zoo2(4 rows)CREATE OR REPLACE RULE voo_d AS ON DELETE TO voo DO INSTEAD  DELETE FROM foo WHERE f1 = old.f1  RETURNING f1, f2;DELETE FROM foo WHERE f1 = 13;DELETE FROM foo WHERE f2 = 'zit' RETURNING *; f1 | f2  | f3 | f4 ----+-----+----+---- 11 | zit | 57 | 99(1 row)SELECT * FROM foo; f1 |  f2  | f3 | f4  ----+------+----+-----  2 | more | 42 | 141 16 | zoo2 | 57 |  99(2 rows)SELECT * FROM voo; f1 |  f2  ----+------  2 | more 16 | zoo2(2 rows)-- Try a join caseCREATE TEMP TABLE joinme (f2j text, other int);INSERT INTO joinme VALUES('more', 12345);INSERT INTO joinme VALUES('zoo2', 54321);INSERT INTO joinme VALUES('other', 0);CREATE TEMP VIEW joinview AS  SELECT foo.*, other FROM foo JOIN joinme ON (f2 = f2j);SELECT * FROM joinview; f1 |  f2  | f3 | f4  | other ----+------+----+-----+-------  2 | more | 42 | 141 | 12345 16 | zoo2 | 57 |  99 | 54321(2 rows)CREATE RULE joinview_u AS ON UPDATE TO joinview DO INSTEAD  UPDATE foo SET f1 = new.f1, f3 = new.f3    FROM joinme WHERE f2 = f2j AND f2 = old.f2    RETURNING foo.*, other;UPDATE joinview SET f1 = f1 + 1 WHERE f3 = 57 RETURNING *, other + 1; f1 |  f2  | f3 | f4 | other | ?column? ----+------+----+----+-------+---------- 17 | zoo2 | 57 | 99 | 54321 |    54322(1 row)SELECT * FROM joinview; f1 |  f2  | f3 | f4  | other ----+------+----+-----+-------  2 | more | 42 | 141 | 12345 17 | zoo2 | 57 |  99 | 54321(2 rows)SELECT * FROM foo; f1 |  f2  | f3 | f4  ----+------+----+-----  2 | more | 42 | 141 17 | zoo2 | 57 |  99(2 rows)SELECT * FROM voo; f1 |  f2  ----+------  2 | more 17 | zoo2(2 rows)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?