Внешние ключи MySQL - ошибка 150 при создании таблиц - PullRequest
2 голосов
/ 10 марта 2012

Я написал некоторый код SQL для создания пяти таблиц с несколькими отношениями (внешними ключами).

Первое отношение внешнего ключа работает нормально, таблицы создаются без ошибок, но когда я пытаюсь создать gasten_url_toegangscodes Я получаю следующую ошибку:

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

Я прочитал документы о внешних ключах и все еще не могу найти проблему ..Самое странное в этом то, что он работает в первых трех таблицах ..

Может кто-нибудь помочь мне, пожалуйста?

Мой полный код SQL:

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;

Спасибозаранее!

1 Ответ

4 голосов
/ 10 марта 2012

Создайте индекс для 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;

И установите кодировку FK в gasten_url_toegangscodes так же, как в соответствующем столбце в gasten.

Предполагаяgasten - это 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;
...