2016-04-19 14 views
1

Ich stolpere auf seltsames Verhalten mit InnoDB Constraint, und kann Ursache dafür nicht finden.
Ich habe Tabellen mit Daten.
unter ihren Strukturen aufgeführt:MySQL InnoDB Constraint funktioniert nicht


CREATE TABLE `contents` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `title` (`title`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `fields` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) NOT NULL, 
    `type` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `nameUNIQUE` (`name`), 
    KEY `name` (`name`), 
    KEY `type` (`type`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `dataTable` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `value` double NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `value_UNIQUE` (`value`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `content_data` (
    `content_id` int(10) unsigned NOT NULL, 
    `field_id` int(10) unsigned NOT NULL, 
    `data_id` bigint(20) unsigned NOT NULL, 
    PRIMARY KEY (`content_id`,`field_id`,`data_id`), 
    KEY `fk_content_data_2_idx` (`field_id`), 
    KEY `fk_content_data_3_idx` (`data_id`), 
    CONSTRAINT `fk_content_data_1` FOREIGN KEY (`content_id`) REFERENCES `contents` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `fk_content_data_2` FOREIGN KEY (`field_id`) REFERENCES `fields` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `fk_content_data_3` FOREIGN KEY (`data_id`) REFERENCES `dataTable` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Nun lassen Sie sich zwei Abfragen ausführen:
erste Abfrage:


mysql> SELECT * FROM `dataTable` where id=21318; 
Empty set (0.00 sec) 

Wir leere Menge bekamen, und das ist in Ordnung, da dataTable in der Tat nicht mit jeder Reihe hat id = 21318
Zweite Abfrage:


mysql> SELECT * FROM `content_data` where data_id=21318; 
+------------+----------+---------+ 
| content_id | field_id | data_id | 
+------------+----------+---------+ 
|  552 |  35 | 21318 | 
+------------+----------+---------+ 
1 row in set (0.00 sec) 

Hier gibt die letzte Abfrage ein Ergebnis mit data_id = 21318. WTF!


Wie erklärt man diese Situation?
Warum Einschränkung nicht funktioniert?
Irgendeine Idee, danke.

+0

Ich weiß nicht über das FK-Problem, aber das EAV-Problem wird durch Werte normalisiert !! –

+0

Oben sehen Sie, dass 'dataTable' keine Zeile mit id = 21318 hat. Und die Tabelle 'content_data' hat eine Zeile mit data_id = 21318. Sie sehen auch, als gibt es eine Einschränkung für 'content_data': CONSTRAINT' fk_content_data_3' FREMDSCHLÜSSEL ('data_id') REFERENZEN' dataTable' ('ID') ON DELETE CASCADE ON UPDATE CASCADE. Wie erklärt man diese Situation? Warum funktioniert die Einschränkung nicht? –

Antwort

2

Wenn ein Aufruf an

gemacht wurde
SET FOREIGN_KEY_CHECKS=0; 

dann sind FK Kontrollen ausgeschaltet. Wer weiß, vielleicht ist das gerade der Zustand Ihres Systems. Lassen Sie sie eingeschaltet mit

SET FOREIGN_KEY_CHECKS=1; 

Beachten Sie Folgendes. Wenn Sie die Überprüfung wieder aktivieren, wird die referenzielle Integrität nicht erneut überprüft. Man braucht dazu ALTER TABLE.

Das einfache Veröffentlichen eines Schemas sagt wenig darüber aus, dass Sie geschützt sind.

Bedeutung, ich könnte meine Einschränkungen deaktivieren, das System verwenden, einige Daten löschen, LOAD DATA INFILE (kurz meine Daten durcheinander), dann zu Stackoverflow mit einem Schema laufen und sagen "Gott, wie ist das passiert ".

Und es spielt keine Rolle, in welchem ​​Zustand sich Ihr System jetzt befindet. Es ist wichtig, was es damals war.

Verwandte Themen