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.
Ich weiß nicht über das FK-Problem, aber das EAV-Problem wird durch Werte normalisiert !! –
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? –