Claves externas de MySQL - Error 150 al crear tablas

He escrito un código SQL para crear cinco tablas con varias relaciones (claves externas).

La primera relación de clave externa funciona bien, las tablas se crean sin errores, pero cuando intento crear gasten_url_toegangscodes Obtuve el siguiente error:

#1005 - Can't create table 'dbname.gasten_url_toegangscodes' (errno: 150).

He leído los documentos sobre claves foráneas y todavía no puedo encontrar el problema. Lo más extraño de esto es que funciona en las tres primeras tablas.

¿Alguien puede ayudarme por favor?

Mi código SQL completo es:

CREATE TABLE IF NOT EXISTS `groepen` (
  `id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `naam` varchar(50) NOT NULL DEFAULT '',
  `status` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `gasten` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `bedrijf` varchar(100) NOT NULL DEFAULT '',
  `uniek` varchar(64) NOT NULL,
  `groepid` tinyint(3) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (groepid) REFERENCES `groepen` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `passen` (
  `id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `naam` varchar(30) NOT NULL DEFAULT '',
  `color` varchar(7) NOT NULL DEFAULT '#FFFFFF',
  `bekend` tinyint(1) NOT NULL DEFAULT '0',
  `welkom` tinyint(1) NOT NULL DEFAULT '0',
  `aantal` tinyint(1) NOT NULL DEFAULT '0',
  `nummer` int(11) NOT NULL DEFAULT '0',
  `begrens` tinyint(1) NOT NULL DEFAULT '0',
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `priority` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `naam` (`naam`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `gasten_url_toegangscodes` (
  `uniek` varchar(64) NOT NULL,
  `unieke_url_code` char(64) NOT NULL,
  `salt` char(16) NOT NULL,
  FOREIGN KEY (uniek) REFERENCES `gasten` (`uniek`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `gasten_tickets` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pas_id` tinyint(3) NOT NULL,
  `uniek` varchar(64) NOT NULL,
  `barcode` char(16) NOT NULL,
  `secret_key` char(32) NOT NULL,
  `download_count` int(11) NOT NULL DEFAULT '0',
  `last_download_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `scanned` enum('N','Y') NOT NULL,
  `scanned_datetime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  FOREIGN KEY (uniek) REFERENCES `gasten` (`uniek`) ON DELETE CASCADE ON UPDATE NO ACTION,
  FOREIGN KEY (pas_id) REFERENCES `passen` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB;

Gracias de antemano!

preguntado el 10 de marzo de 12 a las 14:03

¿Funciona si creas un índice en gasten.uniek? INDEX idx_uniek (uniek) -

La otra diferencia es el conjunto de caracteres predeterminado en gasten_url_toegangscodes -

¡Gracias, esto funciona! ¡Llevaba horas buscando! ¡Gracias de nuevo! -

Ok, lo puse como respuesta entonces. No estaba seguro de que el índice lo arreglaría. -

1 Respuestas

Crea un índice en gasten.uniek

CREATE TABLE IF NOT EXISTS `gasten` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `bedrijf` varchar(100) NOT NULL DEFAULT '',
  `uniek` varchar(64) NOT NULL,
  `groepid` tinyint(3) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `idx_uniek` (`uniek`),
  FOREIGN KEY (groepid) REFERENCES `groepen` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB;

Y configura el conjunto de caracteres del FK en gasten_url_toegangscodes el mismo que el de la columna relacionada en gasten.

Asumiendo gasten es UTF-8:

CREATE TABLE IF NOT EXISTS `gasten_url_toegangscodes` (
  /* use same charset for this column */
  `uniek` varchar(64) NOT NULL CHARSET UTF-8,
  `unieke_url_code` char(64) NOT NULL,
  `salt` char(16) NOT NULL,
  FOREIGN KEY (uniek) REFERENCES `gasten` (`uniek`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

respondido 10 mar '12, 14:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.