Errore Quando si crea una chiave esterna
-
18-09-2019 - |
Domanda
sto ottenendo questo errore quando si cerca di aggiungere un contraint chiave esterna:
#1005 - Can't create table './testtable/#sql-595_146.frm' (errno: 150)
ho bisogno di fare un ON DELETE CASCADE per tutte le immagini che condividono un ID progetto quando quel progetto viene eliminato. La mia struttura della tabella semplificata è la seguente:
CREATE TABLE IF NOT EXISTS `images` (
`image_id` mediumint(8) unsigned NOT NULL auto_increment,
`project_id` smallint(6) NOT NULL,
PRIMARY KEY (`image_id`),
KEY `project_id_ix` (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;
CREATE TABLE IF NOT EXISTS `projects` (
`project_id` smallint(5) unsigned NOT NULL auto_increment,
PRIMARY KEY (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
Ora, quando faccio funzionare la domanda qui sotto per aggiungere il vincolo, la query ha esito negativo con l'errore postato sopra. qualcuno potrebbe aiutare?
ALTER TABLE `images` ADD CONSTRAINT `project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `projects` (`project_id`) ON DELETE CASCADE;
Un milione di Grazie!
Soluzione
modificare le colonne project_id
per avere lo stesso smallint(6)
dimensioni (o 5). È inoltre necessario per renderli sia firmato o non firmato.
... dal sito mysql che dice:
colonne corrispondenti nella chiave esterna e la chiave indicata deve avere simili tipi di dati interna all'interno InnoDB in modo che possano essere confrontati senza conversione di tipo. Le dimensioni e il segno di tipi interi deve essere lo stesso. La lunghezza del tipo di stringa non deve essere lo stesso. Per non binari (caratteri) colonne stringa, il set di caratteri e collazione devono essere uguali.
Altri suggerimenti
Ho pensato che il tipo di dati necessaria per abbinare. project_id è smallint (6) in una tabella e smallint (5) nell'altra.
Non dovrebbe il project_id sia essere smallint(6)
?