I have gone through the issue of making a parent table not writable. After discussing it (1) I adopted the trigger solution. But I think that a trigger is just an invisible layer over the database model and so I'm naively proposing a new syntax to postgresql. It would inform that the check constraint is not inheritable:
create table t (c integer check NOT INHERITABLE (false));
It will be in 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.
Clodoaldo
I found a model visible solution but it only prevents non null values from being inserted. Or only prevents all inserts if that column is not null:
create table tfk (c integer unique check(false));
create table t (c integer, foreign key (c) references tfk(c));
Regards, Clodoaldo
(1) http://stackoverflow.com/questions/9545783/how-to-prevent-inserts-in-a-table