[SQL] two tables - foreign keys referring to each other...
Hey to all, I got two tables, linked to each other. How can I tell the first CREATE TABLE (institute_t) to wait to check the foreign key for the second table??? just like "hold on a little bit... you'll receive your admin_t" :-) ? I thoght DEFERRABLE, DEFERRED and transaction with BEGIN/COMMIT take care of this. ..or generally: how do you create two crosslinked foreign keyed tables? hopefully an easy problem for the real professionals! - here we go BEGIN; -- begin table transaction -- Only Postgresql CREATE TABLE institute_t ( nameVARCHAR(48) PRIMARY KEY, street VARCHAR(48) NOT NULL, zip VARCHAR(16), townVARCHAR(32) NOT NULL, country CHAR(2) NOT NULL, /* country codes ISO-3166*/ phone VARCHAR(32) NOT NULL, fax VARCHAR(32), admin VARCHAR(16) REFERENCES admin_t ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED ); CREATE TABLE admin_t ( login VARCHAR(16) PRIMARY KEY, passwordVARCHAR(16) NOT NULL, email VARCHAR(32) NOT NULL, real_name VARCHAR(32) NOT NULL, street VARCHAR(48) NOT NULL, zip VARCHAR(16), townVARCHAR(32) NOT NULL, country CHAR(2) NOT NULL, /* country codes -- refer to ISO-3166*/ phone VARCHAR(32) NOT NULL, fax VARCHAR(32), access INTEGER NOT NULL, institute VARCHAR(48) REFERENCES institute_t ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED ); COMMIT; of course I get the ERROR, that admin_t doesn't exist. So? help the stupid! pls! best greets, Chris
Re: [SQL] two tables - foreign keys referring to each other...
ThX Kirby, ThX Martijn, as you can see I'm new to the SQL- and database world. My policy for this project is to FORCE an admin to be in an institute. If one admin behaves bad for the database project the institute is responsible for her/him. This institute would be represented by a special admin (therefore the link back). Anyway, I see that crosslinking is really a little bit tricky... I will do this check in the application level (Java) and see, if this is easier and even necessary. For now I might use only admin(fk)-institute. This is necessary to trace back responsibility. as beginner I appreciate good hints, cheers, Chris IMHO, you should consider not having the admin table have a link to the institute table. If you want to find the institute a particular admin is connected with, find that look in the institutes table. The astute reader will note the advice is symmetric, you can not have a link from the institute to the admin. If you don't want to have dangling admin's you might be able to get a trigger/stored procedure to do it for you (Note:I done triggers in Oracle, never in PostGres so take that with a grain of salt. I would be shocked if you couldn't do it with a Trigger under PostGres. I believe it us commonly done with long objects as a matter of fact). Do what you like, and I hope this helps. Kirby