Confusione di vincoli di chiave esterna MySQL
-
06-07-2019 - |
Domanda
Ciao a tutti, ho la seguente tabella "utenti" in MySQL:
CREATE TABLE `users` (
`uid` int(11) NOT NULL auto_increment,
`fname` varchar(50) NOT NULL,
`lname` varchar(50) NOT NULL,
`role` varchar(75) NOT NULL,
`region` tinyint(4) unsigned default NULL,
`username` varchar(25) NOT NULL,
`password` varchar(75) NOT NULL,
`new_pass` varchar(5) default NULL,
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`),
KEY `role` (`role`),
KEY `region` (`region`),
CONSTRAINT `users_ibfk_3` FOREIGN KEY (`role`) REFERENCES `role` (`role`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `users_ibfk_4` FOREIGN KEY (`region`) REFERENCES `region` (`region`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8
Ho 'region' impostato come chiave esterna su una tabella region - region.region '
Si noti che users.region è dichiarato NULL. Ho avuto l'impressione che in MySQL, un vincolo di chiave esterna sia applicato SOLO se la chiave è impostata su NOT NULL.
Tuttavia, quando provo a inserire un utente con una regione NULL nella mia applicazione PHP, ottengo il seguente errore:
ERROR: Cannot add or update a child row: a foreign key constraint fails (`reslife4/users`, CONSTRAINT `users_ibfk_4` FOREIGN KEY (`region`) REFERENCES `region` (`region`) ON DELETE CASCADE ON UPDATE CASCADE)
MA, se dovessi aggiungere questo utente al di fuori della mia applicazione PHP, ad esempio in phpMyAdmin, me lo permetterebbe.
Qualcuno sa cosa sta succedendo?
Soluzione
La tua applicazione inserisce un valore non NULL
in region
.
Abilita il log delle query e vedi cosa esattamente il tuo PHP
cerca di inserire nella tabella.