Index: advanced.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/advanced.sgml,v
retrieving revision 1.42
diff -u -r1.42 advanced.sgml
--- advanced.sgml 1 Aug 2004 17:32:11 -0000 1.42
+++ advanced.sgml 6 Aug 2004 18:05:35 -0000
@@ -108,7 +108,7 @@
);
CREATE TABLE weather (
- city varchar(80) references cities,
+ city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
@@ -326,16 +326,97 @@
- Inheritance is a concept from object-oriented databases. It opens
- up interesting new possibilities of database design.
+ Inheritance is a concept from object-oriented databases. Although
+ it opens up interesting new possibilities of database design,
+ this feature is currently unmaintained and known to have serious
+ gotchas in its foreign key implementation, which you should take
+ care to avoid. The fixes below are probably version-specific and may
+ require updates in the future.
+
+
+ The example below illustrates the gotcha.
+
+
+
+BEGIN;
+CREATE TABLE foo (
+ foo_id SERIAL PRIMARY KEY
+);
+
+CREATE TABLE parent (
+ parent_id SERIAL PRIMARY KEY
+, foo_id INTEGER NOT NULL REFERENCES foo(foo_id) ON DELETE CASCADE
+, parent_1_text TEXT NOT NULL
+);
+
+CREATE TABLE child_1 (
+ child_1_text TEXT NOT NULL
+) INHERITS(parent);
+
+CREATE TABLE child_2 (
+ child_2_text TEXT NOT NULL
+) INHERITS(parent);
+
+INSERT INTO foo VALUES(DEFAULT);
+INSERT INTO child_1 (foo_id, parent_1_text, child_1_text)
+VALUES (currval('public.foo_foo_id_seq'), 'parent text 1', 'child_1 text 1');
+
+INSERT INTO foo VALUES(DEFAULT);
+INSERT INTO child_1 (foo_id, parent_1_text, child_1_text)
+VALUES (currval('public.foo_foo_id_seq'), 'parent text 2', 'child_1 text 2');
+
+INSERT INTO foo VALUES(DEFAULT);
+INSERT INTO child_2 (foo_id, parent_1_text, child_2_text)
+VALUES (currval('foo_foo_id_seq'), 'parent text 3', 'child_2 text 1');
+
+DELETE FROM foo WHERE foo_id = 1;
+
+SELECT * FROM parent;
+ parent_id | foo_id | parent_1_text
+-----------+--------+---------------
+ 1 | 1 | parent text 1
+ 2 | 2 | parent text 2
+ 3 | 3 | parent text 3
+(3 rows)
+
+SELECT * FROM child_1;
+ parent_id | foo_id | parent_1_text | child_1_text
+-----------+--------+---------------+----------------
+ 1 | 1 | parent text 1 | child_1 text 1
+ 2 | 2 | parent text 2 | child_1 text 2
+(2 rows)
+ROLLBACK;
+
+
+
+
+ Oops!! None of parent, child or foo should have any rows with
+foo_id = 1 in them. Here is a way to fix the above tables.
+
+
+
+ To fix the gotcha, you must put foreign key constraints on each of
+ the child tables, as they will not be automatically inherited as
+ you might expect.
+
+
+
+
+ALTER TABLE child_1 ADD CONSTRAINT cascade_foo
+FOREIGN KEY (foo_id) REFERENCES foo(foo_id) ON DELETE CASCADE;
+
+ALTER TABLE child_2 ADD CONSTRAINT cascade_foo
+FOREIGN KEY (foo_id) REFERENCES foo(foo_id) ON DELETE CASCADE;
+
- Let's create two tables: A table cities
- and a table capitals. Naturally, capitals
- are also cities, so you want some way to show the capitals
- implicitly when you list all cities. If you're really clever you
- might invent some scheme like this:
+ That caveat out of the way, let's create two tables: A table
+ cities and a table
+ capitals. Naturally, capitals are also cities,
+ so you want some way to show the capitals implicitly when you list all
+ cities. If you're really clever you might invent some scheme like
+ this:
CREATE TABLE capitals (
@@ -358,7 +439,7 @@
This works OK as far as querying goes, but it gets ugly when you
- need to update several rows, to name one thing.
+ need to update several rows, for one thing.
Index: query.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/query.sgml,v
retrieving revision 1.35
diff -u -r1.35 query.sgml
--- query.sgml 29 Nov 2003 19:51:37 -0000 1.35
+++ query.sgml 6 Aug 2004 18:05:36 -0000
@@ -284,8 +284,10 @@
SELECT * FROM weather;
- (here * means all columns
) and
- the output should be:
+ (here * means all columns
.
+ Note: While SELECT * is useful for off-the-cuff
+ queries, it is considered bad style in production code for
+ maintenance reasons) and the output should be:
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------