2012-03-10 135 views
2

我寫了一些SQL代碼來創建具有幾個關係(外鍵)的五個表。MySQL外鍵 - 創建表時出現錯誤150

第一個外鍵關係工作正常,在沒有任何錯誤創建的表,但是當我嘗試創建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

如果你創建'gasten.uniek'指數是否行得通? 'INDEX idx_uniek(uniek)' – 2012-03-10 14:13:44

+1

另一個不同是'gasten_url_toegangscodes'上的默認字符集' – 2012-03-10 14:15:17

+0

謝謝,這個工程!一直在尋找幾個小時!再次感謝! – 2012-03-10 14:39:11

回答

4

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;