2012-04-13 5 views
0

Ich habe eine ‚Look-up‘ Tabelle mit voreingestellten Werten (wurde darüber informiert, es als ENUM ist besser)Löscht MySQL Referenzen?

CREATE TABLE tbl_payment_type (
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    description VARCHAR(25) 
); 
INSERT INTO tbl_payment_type 
    (description) 
VALUES 
    ('PAYPAL'), 
    ('DEBIT CARD'), 
    ('CREDIT CARD'), 
    ('CASH ON DELIVERY'); 

nun jeder meiner Aufträge enthält eine Zahlungsart.

CREATE TABLE tbl_order (
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    ... 
    payment_type INT, 
    FOREIGN KEY(payment_type) REFERENCES tbl_payment_type(id) 
) AUTO_INCREMENT = 1000; 

ich derzeit MyISAM bin mit aber vielleicht InnoDB in Zukunft ausprobieren (ich bin nicht sicher, ob das die Frage betrifft).

Und schließlich, die Frage ist, wenn ich versuche, einen Datensatz von tbl_payment_type zu löschen, wird dies dazu führen, dass MySQL automatisch alle Datensätze aus tbl_order löschen, die diesen Zahlungstyp enthalten?

Antwort

3

MyISAM unterstützt keine Fremdschlüssel, sodass bei der Verwendung dieses Speicheranbieters nichts passiert.

InnoDB unterstützt Fremdschlüssel und standardmäßig werden DELETE und UPDATES in keine fremden Übereinstimmungen eingeschränkt. Dieses Verhalten kann mit den Optionen ON DELETE und ON UPDATE geändert werden. Siehe FOREIGN KEY Constraints auf der MySQL-Website.

+0

Okay dank versuchen. Ich schätze, ich bleibe dann einfach bei MyISAM. – Ozzy

+0

Was ist der Sinn der Frage nach Fremdschlüsseln, wenn Sie eine Engine verwenden, die sie ignoriert? :) –

+0

@ N.B. Hmmmm, als ich die DB auf Papier entworfen habe, habe ich natürlich eine relationale Datenbank erstellt. Als ich das in MySQL umwandelte, war mir nicht klar, dass FK standardmäßig nicht unterstützt wurde. Ich muss mehr lernen, bevor ich InnoDB benutze. Zumindest mit diesen Links wird es schnell wechseln, wenn ich es in Zukunft brauche. Wenn man sich den SQL-Quellcode anschaut, kann man besser nachvollziehen, was mit den verbleibenden FK-Beschränkungen passiert. – Ozzy

1

Es wird Ihnen ein Fehler, wenn Sie DELETE einen Eintrag von payment_type von tbl_payment_type

delete from `test`.`tbl_payment_type` where `id`='2' 

Error:1451 Cannot delete or update a parent row: a foreign key constraint fails (test . tbl_order , CONSTRAINT tbl_order_ibfk_1 FOREIGN KEY (payment_type) REFERENCES tbl_payment_type (id))

+0

@MalheshPatil Das gilt nur für InnoDB, oder? Und könnten Sie uns zeigen, wie man einen Datensatz mit einem FK korrekt löscht, wenn Sie InnoDB verwenden? – Ozzy

+0

BTW: Dies gilt nur für den InnoDB-Typ incase von MyISAM gibt es keine Beziehung daher hat keine Auswirkung auf das Löschen in einer anderen Tabelle –

+0

Zuerst müssen Sie alle Einträge in 'payment_type' aus' tbl_order' löschen, nur dann können Sie einen Eintrag löschen 'tbl_payment_type ' Beispiel: Wenn Sie einen Eintrag für' Paypal'from 'tbl_payment_type' löschen möchten, sollten Sie alle Einträge aus' tbl_order' löschen, die' id' = 1 haben, nur dann können Sie einen Eintrag aus 'tbl_payment_type' löschen Das hat 'ID' = 1 (Paypal) –