2017-11-13 8 views
0

Ich habe ein wirklich seltsames (und beängstigendes) Problem: Meine mySQL DB ignoriert im Allgemeinen Fremdschlüsseleinschränkungen!MySQL DB ignoriert Fremdschlüsseleinschränkungen

Alle meine Tabellen sind InnoDB und ich sie mit Liquibase wie folgt zu schaffen:

<addForeignKeyConstraint baseColumnNames="user_account_id" 
    baseTableName="account_transaction" 
    constraintName="fk_account_transaction_user_account_id" 
    referencedColumnNames="id" 
    referencedTableName="user_account"/> 

Die Fremdschlüssel werden erstellt, in Ordnung. In HeidiSQL Ich sehe sie wie folgt aus: heidiSQL DB Management

ich auch für FOREIGN_KEY_CHECKS geprüft und ich habe es auf 1 (SET FOREIGN_KEY_CHECKS=1;)

Alle meine ID-Spalten haben den Datentyp BIGINT (weiß nicht, ob diese Fragen).

Was auch wert zu erwähnen: Die folgende Anweisung

SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_SCHEMA = DATABASE(); 

gibt eine Reihe von Einschränkungen, aber keine Fremdschlüssel-Constraints ... Wenn ich die gleiche Aussage auf meiner lokalen mySQL DB ausführen, es gibt all die Einschränkungen einschließlich Fremdschlüsseleinschränkungen. Ich kann nicht herausfinden, was ist der Unterschied zwischen ihnen, obwohl ...

Jede Hilfe wird sehr geschätzt :)

@Update: So der Hinweis mit MyISAM und InnoDB hat den Trick. Ich habe das schon mal untersucht. Aus irgendeinem Grund sind meine Tabellen jedoch InnoDB, aber meine DB ist MyISAM. Ich werde machen weitere Untersuchungen an, dass :) enter image description here

+0

Sind die Tabellen den Motor MyISAM-Speicher verwenden? Sie müssen InnoDB verwenden. Fremdschlüsseleinschränkungen werden in anderen Speicher-Engines ignoriert.'SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATENBANK();' –

+0

Leider sind sie alle InnoDB, wie ich oben erwähnt – dave0688

+0

Wenn die FOREIGN KEY Einschränkungen nicht in information_schema.table_constraints angezeigt werden, sind sie nicht definiert. Führen Sie eine 'SHOW CREATE TABLE account_transaction' durch, um zu bestätigen. (Die wahrscheinlichste Erklärung ist, dass die Speicher-Engine nicht InnoDB ist - überprüfen Sie, wie Bill Karwin vorgeschlagen hat, die ENGINE-Spalte von information_schema.tables. Ich denke, HeidiSQL zeigt die Indizes, nicht die Einschränkungen. Klingt, als ob Liquibase mehr im Weg ist als es hilft.) – spencer7593

Antwort

1

Als Bill Karwin stellt in seinem Kommentar, FOREIGN KEY-Einschränkungen sind ignoriert, wenn die Tabelle nicht InnoDB ist.

Demonstration:

CREATE TABLE foo_p 
(id BIGINT UNSIGNED PRIMARY KEY 
) ENGINE=MYISAM 
; 

CREATE TABLE foo_c 
(id BIGINT UNSIGNED PRIMARY KEY 
, p_id BIGINT UNSIGNED 
) ENGINE=MYISAM 
; 

hinzufügen Fremdschlüssel:

ALTER TABLE foo_c 
    ADD CONSTRAINT fk_foo_c_foo_p 
    FOREIGN KEY (id) REFERENCES foo_p (id) 
    ON DELETE NO ACTION ON UPDATE NO ACTION 
; 

MySQL erstellt ein Index aber kein Fremdschlüssel.

ändern Speicher-Engine InnoDB erstellt keine Fremdschlüssel:

ALTER TABLE foo_p ENGINE=INNODB ; 

ALTER TABLE foo_c ENGINE=INNODB ; 

Verwenden SHOW CREATE TABLE foo_c Tabelle Definition siehe:

CREATE TABLE `foo_c` (
    `id` BIGINT(20) UNSIGNED NOT NULL, 
    `p_id` BIGINT(20) UNSIGNED DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_foo_c_foo_p` (`id`) 
) ENGINE=INNODB 

Es gibt einen Index (aus der MyISAM Definition umgewandelt), aber keinen Fremdschlüssel .

Um einen Fremdschlüssel hinzu:

ALTER TABLE foo_c 
    DROP KEY fk_foo_c_foo_p 
, ADD CONSTRAINT fk_foo_c_foo_p 
    FOREIGN KEY (p_id) REFERENCES foo_p (id) 
    ON DELETE NO ACTION ON UPDATE NO ACTION 
; 

A SHOW CREATE TABLE zeigt die FOREIGN KEY-Einschränkung, sowie den Index, der automatisch erstellt wurde:

CREATE TABLE `foo_c` (
    `id` BIGINT(20) UNSIGNED NOT NULL, 
    `p_id` BIGINT(20) UNSIGNED DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_foo_c_foo_p` (`p_id`), 
    CONSTRAINT `fk_foo_c_foo_p` FOREIGN KEY (`p_id`) REFERENCES `foo_p` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=INNODB 
+0

Wow, das macht so viel Sinn! Vielen Dank für Ihr Wissen :) – dave0688

Verwandte Themen