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!

È stato utile?

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)?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top