Foreign Key lässt sich nicht erzeugen(Cannot add foreign key constraint)

Tiyen

Benutzer
Beiträge
5
Hallo zusammen,

bin hier gerade am Lernen für meine Datenbankprüfung :) und auf folgendes Problem gestoßen:
Ich möchte eine Tabelle "Person" und eine Tabelle "Rolle" anlegen. Person soll einen Fremdschlüssel von Rolle haben. Aber ich bekomme beim Ausführen immer den Fehler "Cannot add foreign key constraint"

Code:
drop database if exists KIS;

create database KIS;

create table Person(
   pId integer not null auto_increment primary key,
   vorname varchar(25),
   nachname varchar(30),
  geschlecht varchar(15),
  geburtsdatum date,
  rId integer,
   foreign key(rId) references Rolle(rId)
  );
   
create table Rolle(
   rId integer not null auto_increment primary key
  );

Könnt ihr mir da vllt weiterhelfen? Bin für jeden Rat dankbar.
 
Werbung:
Hallo zusammen,


Code:
create table Person(
... 
   foreign key(rId) references Rolle(rId)
  );
 
create table Rolle(
   rId integer not null auto_increment primary key
  );

Könnt ihr mir da vllt weiterhelfen? Bin für jeden Rat dankbar.

Zu dem zeitpunkt, wo Du auf Rolle referenzierst, existiert diese Tabelle noch nicht. Denk drüber nach, und Du erkennst die Lösung.
 
D.h. ich müsste Rolle dann anlegen, bevor create table Person aufgerufen wird?

Referenzierte Objekte müssen halt existieren. Kann sein, daß es in MySQL auch ohne diese Bedingung geht - MySQL erlaubt ja viel Bullshit und ermöglich auch z.B. Views auf nicht existierende Tabellen.

Aber so wie Du das machst würde ich einfach die Reihenfolge umdrehen.

Interessant wird es, wenn Tabellen sich gegenseitig referenzieren sollen. So z.B.:

Code:
test=# create table x1 (id int primary key, fk int );
CREATE TABLE
Time: 9,901 ms
test=*# create table x2 (id int primary key, fk int references x1);
CREATE TABLE
Time: 2,430 ms
test=*# alter table x1 add constraint check_x1 foreign key (fk) references x2;
ALTER TABLE
Time: 1,348 ms
test=*# \d x1
  Table "public.x1"
 Column |  Type  | Modifiers
--------+---------+-----------
 id  | integer | not null
 fk  | integer |
Indexes:
  "x1_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
  "check_x1" FOREIGN KEY (fk) REFERENCES x2(id)
Referenced by:
  TABLE "x2" CONSTRAINT "x2_fk_fkey" FOREIGN KEY (fk) REFERENCES x1(id)

test=*# \d x2
  Table "public.x2"
 Column |  Type  | Modifiers
--------+---------+-----------
 id  | integer | not null
 fk  | integer |
Indexes:
  "x2_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
  "x2_fk_fkey" FOREIGN KEY (fk) REFERENCES x1(id)
Referenced by:
  TABLE "x1" CONSTRAINT "check_x1" FOREIGN KEY (fk) REFERENCES x2(id)

test=*#
 
Starker Tobak :S Ich hab es jetzt mal versucht, aber nun bekomme ich schon den nächsten Fehler : "table Rolle already exists"
Hab mal die ganze sql. eingefügt. Vielleicht übersehe ich nur was. Die DB wird ja aber jedes mal gelöscht, wenn ich das Script ausführe... Kann es sein, dass das was mit den Beziehungen zw. den Tabellen zu tun hat ?

Code:
drop database if exists KIS;
create database KIS;

create table Rolle(
   rId integer not null auto_increment primary key
  );
  
create table Person(
   pId integer not null auto_increment primary key,
   vorname varchar(25),
   nachname varchar(30),
  geschlecht varchar(15),
  geburtsdatum date,
  rId integer,
   foreign key(rId) references Rolle(rId)
  );
  
create table Code(
   codeId integer not null auto_increment primary key,
  anzeigename varchar(30),
  foreign key(cId) references Codesystem(cId)
);
  
create table Handlung(
   hId integer not null auto_increment primary key,
  hname varchar(25),
  details varchar(30),
  datum date,
  foreign key(codeId) references Code(codeId)
   );
create table Codesystem(
   cId integer not null auto_increment primary key,
  name varchar(30)
);

create table nimmtTeil(
   foreign key(rId) references Rolle(rId),
  foreign key (hId) references Handlung(hId)
);

create table nutzt(
   foreign key(rId) references Rolle(rId),
  foreign key (cId) references Code(cId)
);
 
Starker Tobak :S Ich hab es jetzt mal versucht, aber nun bekomme ich schon den nächsten Fehler : "table Rolle already exists"
Hab mal die ganze sql. eingefügt. Vielleicht übersehe ich nur was. Die DB wird ja aber jedes mal gelöscht, wenn ich das Script ausführe... Kann es sein, dass das was mit den Beziehungen zw. den Tabellen zu tun hat ?

Ich nix MySQL. Also, ich nutze es nicht. Sehe nur tagtäglich unsere Opfer, ähm, Kunden, die es nutzen.

Vermutlich solltest Du ein 'use KIS' einfügen, ich vermute, Du legst die Tabellen in der aktuelle DB an, nicht in KIS. Und das mit dem "Referenzierte Objekte müssen halt existieren." hast auch noch ned verstanden, gell?
 
Doch doch das mit den referenzierten Objekten ist mir jetzt klar :) Habe es mit use KIS probiert jetzt funktioniert es auch. Muss nur noch die restlichen Stellen ausmerzen;)
 
Nicht lieber als das aber unser Prof. benutzt nur MySQL. Ich weiß nicht ob ich das einfach austauschen kann, wobei PostgreSQL mit großer Wahrscheinlichkeit 10x besser ist
 
Werbung:
Man kann auch mit ALTER TABLE xxx ADD CONSTRAINT einen Schlüssel nachträglich auf eine existiende Spalte und existierende Tabellen legen wenn noch keine Daten enthalten sind die dem Constraint widersprechen. Sollte zumindest auch in MySQL so sein :)
 
Zurück
Oben