I’m looking for a way to set up a one to many relationship between 2 tables. The table structures is explained below but I’ve tried to leave everything off that has nothing to do with the problem.
Table objects has 1 column called uuid.
Table contents has 3 columns called content, object_uuid and timestamp.
The basic idea is to insert a row into objects and get a new uuid from the database. This uuid is then used stored for every row in contents to associate contents with objects.
Now I’m trying to use the database to enforce that:
- Each row in
contentsreferences a row inobjects(a foreign key should do) - No row in
objectsexists without at least arowincontents
These constraints should be enforced on commit of transactions.
Ordinary triggers can’t help probably because when a row in the objects table is written, there can’t be a row in contents yet. Postgres does have so called constraint triggers that can be deferred until the end of the transaction. It would be possible to use those but they seem to be some sort of internal construct not intended for everyday use.
Ideas or solutions should be standard SQL (preferred) or work with Postgres (version does not matter). Thanks for any input.
Your main problem is that other than foreign key constraints; no constraint can reference another table.
Your best bet is to denormalize this a little and have a column on
objectcontaining the count ofcontentsthat reference it. You can create a trigger to keep this up to date.contents_count INTEGER NOT NULL DEFAULT 0This won’t be as unbreakable unless you put some user security over who can update this column. But if you keep it up to date with a trigger and all you’re looking to avoid is accidental corruption, this should be sufficient.
EDIT: As per the comment,
CHECKconstraints are not deferrable. This solution would raise an error if all the contents are removed even if the intention is to add more in the same transaction.