hallöchen,
ich habe ein kleines problem mit deferred constraints unter pgsql, und zwar:
es gibt 3 tabellen, (1) user (2) telefon-nr und (3) adresse. ein user wird bei der registrierung in die tabelle user eingetragen, gleichzeitig soll eine telefon-nr und eine adresse eingetragen und mittels id als foreign key zu diesem user verbunden werden.
hier mal meine tabellen-definitionen:
-- Table: druckdotpro.tb_tel
CREATE TABLE druckdotpro.tb_tel(
id integer NOT NULL DEFAULT nextval('druckdotpro.sq_tel'::regclass),
nr integer NOT NULL,
erreichbar character varying(200),
uid integer NOT NULL,
CONSTRAINT pk_tel PRIMARY KEY (id),
CONSTRAINT un_nr UNIQUE (nr)
)
WITH (
OIDS=FALSE
);
ALTER TABLE druckdotpro.tb_tel OWNER TO postgres;
-- Table: druckdotpro.tb_adresse
CREATE TABLE druckdotpro.tb_adresse(
id integer NOT NULL DEFAULT nextval('druckdotpro.sq_adresse'::regclass),
adresse character varying(200) NOT NULL,
plz integer NOT NULL,
ort character varying(50) NOT NULL,
lid integer,
uid integer NOT NULL,
CONSTRAINT pk_adresse PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE druckdotpro.tb_adresse OWNER TO postgres;
-- Table: druckdotpro.tb_user
CREATE TABLE druckdotpro.tb_user(
id integer NOT NULL DEFAULT nextval('druckdotpro.sq_user'::regclass),
username character varying(50) NOT NULL,
titel character varying(50),
nachname character varying(50) NOT NULL,
vorname character varying(50) NOT NULL,
geschlecht boolean NOT NULL DEFAULT false,
gebdatum date NOT NULL,
email character varying(100) NOT NULL,
firma character varying(100),
adressid integer NOT NULL,
telid integer NOT NULL,
userkatid integer NOT NULL,
CONSTRAINT pk_user PRIMARY KEY (id),
CONSTRAINT un_email UNIQUE (email),
CONSTRAINT un_username UNIQUE (username)
)
WITH (
OIDS=FALSE
);
ALTER TABLE druckdotpro.tb_user OWNER TO postgres;
weiter unten habe ich dann die foreign keys, die deferred werden sollen, mittels alter table definiert:
-- Tabelle Telefon
ALTER TABLE druckdotpro.tb_tel ADD CONSTRAINT fk_uid
FOREIGN KEY (uid) REFERENCES druckdotpro.tb_user (id)
DEFERRABLE INITIALLY DEFERRED;
-- Tabelle Adresse
ALTER TABLE druckdotpro.tb_adresse ADD CONSTRAINT fk_lid
FOREIGN KEY (lid) REFERENCES druckdotpro.tb_land (id)
DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE druckdotpro.tb_adresse ADD CONSTRAINT fk_uid
FOREIGN KEY (uid) REFERENCES druckdotpro.tb_user (id)
DEFERRABLE INITIALLY DEFERRED;
-- Tabelle User
ALTER TABLE druckdotpro.tb_user ADD CONSTRAINT fk_adressid
FOREIGN KEY (adressid) REFERENCES druckdotpro.tb_adresse (id)
DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE druckdotpro.tb_user ADD CONSTRAINT fk_telid
FOREIGN KEY (telid) REFERENCES druckdotpro.tb_tel (id)
DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE druckdotpro.tb_user ADD CONSTRAINT fk_userkatid
FOREIGN KEY (userkatid) REFERENCES druckdotpro.tb_userkat (id)
DEFERRABLE INITIALLY DEFERRED;
soweit mal kein problem, das aufbauen der datenbank funktioniert reibungslos, nur bei den inserts macht er mätzchen. folgendes möchte ich inserten:
BEGIN;
insert into druckdotpro.tb_tel (nr, erreichbar, uid)
values (0660123456, 'gar nicht', 1);
insert into druckdotpro.tb_adresse (adresse, plz, ort, lid, uid)
values ('dortstraße 1', 1100, 'wien', 1, 1);
insert into druckdotpro.tb_user (username, titel, nachname, vorname, geschlecht, gebdatum, email, firma, adressid, telid, userkatid)
values ('uname1', 'kaiser', 'somename', 'somemorename', true, '2009-01-01', 'abc@mail.com', 'meifirma', 1, 1, 1);
COMMIT;
dabei bekomme ich jedoch folgende fehlermeldung von pgadmin:
[HTML]FEHLER: Einfügen oder Aktualisieren in Tabelle »tb_tel« verletzt Fremdschlüssel-Constraint »fk_uid«
DETAIL: Schlüssel (uid)=(1) ist nicht in Tabelle »tb_user« vorhanden.
********** Error **********
FEHLER: Einfügen oder Aktualisieren in Tabelle »tb_tel« verletzt Fremdschlüssel-Constraint »fk_uid«
SQL state: 23503
Detail: Schlüssel (uid)=(1) ist nicht in Tabelle »tb_user« vorhanden.[/HTML]laut pdadmin gibt es also eine foreign-key-verletzung, was allerdings nicht sein dürfte, da sie ja deferred sind, und die inserts mittels begin und commit zu einer transaktion zusammengefasst sind.
wo liegt hier das problem?
PS: bei den inserts werden bei adresse eine lid (steht für land-id) und bei user eine userkatid eingetragen, diese verweisen als foreign key auf andere tabellen, die aber im vorhinein schon definiert wurden und deren werte vorhanden sind. das ist also nicht das problem…
herzlichen dank für hilfreiche hinweise
lg
andiwini