There is a table t which has inherited children. I want that only the children can receive inserts. What is the best way to force that the parent table rejects inserts?
create table t (c int);
create table t1 () inherits (t);
This should not be possible:
insert into t (c) values (1);
EDIT:
I found a model visible solution in addition to the one from @wildplasser:
create table tfk (c integer unique check(false));
create table t (c integer, foreign key (c) references tfk(c));
Now it is not possible to insert into t
UNLESS it is a null value, and still possible to insert into
its children. It can be a good solution if that columnn is already constrained as not null
but not enough otherwise. Or does someone know a trick to make the above work for null values?
I asked for a new syntax in the postgresql list and it was done for 9.2:
Allow CHECK constraints to be declared NO INHERIT (Nikhil Sontakke, Alex Hunsaker)
This makes them enforceable only on the parent table, not on child tables.
You could use a before insert trigger to raise an error or redirect to the correct table.