*Markus: Verletzung der Integrität möglich obwohl FK

Hallo,

mit folgendem Datenmodell...

und folgendem MySQL-Script...

  
CREATE TABLE IF NOT EXISTS Artikel  
  
      (a_id                  INTEGER NOT NULL AUTO_INCREMENT,  
  
       h_id                  INTEGER NOT NULL ,  
  
       a_bez                 VARCHAR(100) NULL,  
  
       a_bild                VARCHAR(100) NULL,  
       PRIMARY KEY (a_id)  
  
);  
  
  
  
CREATE UNIQUE INDEX XPKArtikel  
  
  ON Artikel  
  
(  
  
a_id  
  
);  
  
  
  
  
  
  
  
CREATE TABLE IF NOT EXISTS Artikel_Supermarkt  
  
      (s_id                  INTEGER NOT NULL,  
  
       a_id                  INTEGER NOT NULL,  
  
       eh_id                 INTEGER NULL,  
  
       preis                 FLOAT NULL,  
       PRIMARY KEY (s_id,a_id)  
  
);  
  
  
  
CREATE UNIQUE INDEX XPKArtikel_Supermarkt  
  
  ON Artikel_Supermarkt  
  
(  
  
s_id,  
  
a_id  
  
);  
  
  
  
  
  
  
  
CREATE TABLE IF NOT EXISTS Einheit  
  
      (eh_id                 INTEGER NOT NULL AUTO_INCREMENT,  
  
       eh_bez                VARCHAR(5) NULL,  
       PRIMARY KEY (eh_id)  
  
);  
  
  
  
CREATE UNIQUE INDEX XPKEinheit  
  
  ON Einheit  
  
(  
  
eh_id  
  
);  
  
  
  
  
  
  
  
CREATE TABLE IF NOT EXISTS Hersteller  
  
      (h_id                  INTEGER NOT NULL AUTO_INCREMENT,  
  
       h_bez                 VARCHAR(100) NULL,  
       PRIMARY KEY (h_id)  
  
);  
  
  
  
CREATE UNIQUE INDEX XPKHersteller  
  
  ON Hersteller  
  
(  
  
h_id  
  
);  
  
  
  
  
  
  
  
CREATE TABLE IF NOT EXISTS Supermarkt  
  
      (s_id                  INTEGER NOT NULL AUTO_INCREMENT,  
  
       s_name                VARCHAR(50) NULL,  
       PRIMARY KEY (s_id)  
  
);  
  
  
  
CREATE UNIQUE INDEX XPKSupermarkt  
  
  ON Supermarkt  
  
(  
  
s_id  
  
);  
  
  
  
  
  
ALTER TABLE Artikel  
  
ADD  (  CONSTRAINT R_4 FOREIGN KEY  (h_id)  
  
               REFERENCES Hersteller  
  
               ON DELETE RESTRICT )  
  
;  
  
  
  
ALTER TABLE Artikel_Supermarkt  
  
ADD  (  CONSTRAINT R_6 FOREIGN KEY  (eh_id)  
  
               REFERENCES Einheit  
  
               ON DELETE RESTRICT )  
  
;  
  
  
  
ALTER TABLE Artikel_Supermarkt  
  
ADD  (  CONSTRAINT R_3 FOREIGN KEY  (a_id)  
  
               REFERENCES Artikel  
  
               ON DELETE RESTRICT )  
  
;  
  
  
  
ALTER TABLE Artikel_Supermarkt  
  
ADD  (  CONSTRAINT R_2 FOREIGN KEY  (s_id)  
  
               REFERENCES Supermarkt  
  
               ON DELETE RESTRICT )  
  
;  
  
  

...schaffe ich es, in den leeren Tabellen per INSERT zumindest in Artikel_Supermarkt oder Artikel Werte einzufügen, obwohl die PKs in Tabellen wie Artikel oder Supermarkt noch gar nicht vorhanden sind.
Zuerst dachte ich, dass keine FKs gesetzt sind, aber das Script läuft problemlos durch ohne Fehlermeldung.
Wieso können Werte eingefügt werden, obwohl es eigentlich solange nicht funktionieren dürfte bis, PKs in den anderen Tabellen außer der Zwischentabelle gesetzt wurden?

Danke,
Markus

  1. Hallo,

    ...schaffe ich es, in den leeren Tabellen per INSERT zumindest in Artikel_Supermarkt oder Artikel Werte einzufügen, obwohl die PKs in Tabellen wie Artikel oder Supermarkt noch gar nicht vorhanden sind.

    Wieso können Werte eingefügt werden, obwohl es eigentlich solange nicht funktionieren dürfte bis, PKs in den anderen Tabellen außer der Zwischentabelle gesetzt wurden?

    vermutlich weil Du nicht InnoDB als Tabellenengine verwendet hast.
    Leider geht dies aus Deinem Code nicht hervor. Foreign-Key-Constraints werden von MySQL derzeit nur bei InnoDB unterstützt.

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      danke für die Info. Ich werde es heute Abend gleich ausprobieren.

      Viele Grüße,
      Markus

      1. Hallo,

        ...hat funktioniert (nachdem ich auch die Syntax der Contraints anpassen musste).

        Viele Grüße,
        Markus