Advertisement
Guest User

PostgreSQL view for one-to-one tables.

a guest
Mar 30th, 2015
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 3.04 KB | None | 0 0
  1. -- drop view foobar;
  2. -- drop table bar;
  3. -- drop table foo;
  4.  
  5. CREATE TABLE foo (
  6.   id serial PRIMARY KEY,
  7.   a INTEGER,
  8.   b INTEGER
  9. );
  10.  
  11. CREATE TABLE bar (
  12.   foo_id INTEGER PRIMARY KEY REFERENCES foo ON DELETE CASCADE ON UPDATE CASCADE,
  13.   c INTEGER,
  14.   d INTEGER
  15. );
  16.  
  17. CREATE VIEW foobar AS
  18.   SELECT
  19.     foo.id,
  20.     foo.a,
  21.     foo.b,
  22.     bar.c,
  23.     bar.d
  24.   FROM foo, bar
  25.   WHERE foo.id = bar.foo_id
  26.   ORDER BY foo.id
  27. ;
  28.  
  29. CREATE OR REPLACE FUNCTION foobar_update() RETURNS TRIGGER AS $$
  30.   DECLARE
  31.     new_id INTEGER;
  32.   BEGIN
  33.     -- Perform the required operation on foo and bar
  34.     -- to reflect the change made to foobar.
  35.     IF (TG_OP = 'DELETE') THEN
  36.       DELETE FROM foo WHERE id = OLD.id;
  37.       -- no need to delete from bar, that should be cascaded.
  38.       IF NOT FOUND THEN RETURN NULL; END IF;
  39.       RETURN OLD;
  40.     ELSIF (TG_OP = 'UPDATE') THEN
  41.       UPDATE foo SET id = NEW.id,
  42.                       a = NEW.a,
  43.                       b = NEW.b WHERE id = OLD.id;
  44.       IF NOT FOUND THEN RETURN NULL; END IF;
  45.       UPDATE bar SET c = NEW.c,
  46.                      d = NEW.d WHERE foo_id = NEW.id;
  47.                      -- use NEW.id here because changes should be cascaded already.
  48.       IF NOT FOUND THEN RETURN NULL; END IF;
  49.       RETURN NEW;
  50.     ELSIF (TG_OP = 'INSERT') THEN
  51.       -- pk should be what is given by the user, or whatever's next in the sequence.
  52.       -- evaluating nextval() into a variable makes sure it's incremented always.
  53.       new_id := NEXTVAL('foo_id_seq');
  54.       NEW.id := COALESCE(NEW.id, new_id);
  55.       INSERT INTO foo (id,
  56.                        a,
  57.                        b)
  58.                VALUES (NEW.id,
  59.                        NEW.a,
  60.                        NEW.b);
  61.       INSERT INTO bar (foo_id,
  62.                        c,
  63.                        d)
  64.                VALUES (NEW.id,
  65.                        NEW.c,
  66.                        NEW.d);
  67.       RETURN NEW;
  68.     END IF;
  69.   END;
  70. $$ LANGUAGE plpgsql;
  71.  
  72. CREATE TRIGGER foobar_update_trigger
  73. INSTEAD OF INSERT OR UPDATE OR DELETE ON foobar
  74.   FOR EACH ROW EXECUTE PROCEDURE foobar_update();
  75.  
  76. INSERT INTO foobar (a, b, c, d) VALUES (1, 2, 3, 4);
  77. INSERT INTO foobar (a, b, c, d) VALUES (2, 3, 4, 5);
  78. INSERT INTO foobar (a, b, c, d) VALUES (3, 4, 5, 6);
  79. INSERT INTO foobar (a, b, c, d) VALUES (4, 5, 6, 7);
  80. INSERT INTO foobar (a, b, c, d) VALUES (5, 6, 7, 8);
  81. INSERT INTO foobar (a, b, c, d) VALUES (6, 7, 8, 9);
  82. INSERT INTO foobar (a, b, c, d) VALUES (1, DEFAULT, DEFAULT, DEFAULT);
  83. INSERT INTO foobar (a, b, c, d) VALUES (DEFAULT, 1, DEFAULT, DEFAULT);
  84. INSERT INTO foobar (a, b, c, d) VALUES (DEFAULT, DEFAULT, 1, DEFAULT);
  85. INSERT INTO foobar (a, b, c, d) VALUES (DEFAULT, DEFAULT, DEFAULT, 1);
  86. UPDATE foobar
  87.    SET b = 20
  88.  WHERE id = 3;
  89. UPDATE foobar
  90.    SET c = 25
  91.  WHERE id = 4;
  92. DELETE FROM foobar WHERE id = 5;
  93. UPDATE foobar
  94.    SET id = 5
  95.  WHERE id = 1;
  96.  
  97. SELECT * FROM foobar;
  98. -- expected output:
  99. -- id;a;b;c;d <-- fields
  100. -- 2;2;3;4;5
  101. -- 3;3;20;5;6
  102. -- 4;4;5;25;7
  103. -- 5;1;2;3;4
  104. -- 6;6;7;8;9
  105. -- 7;1;;;
  106. -- 8;;1;;
  107. -- 9;;;1;
  108. -- 10;;;;1
  109. --
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement