2012-11-08 49 views
1

我在創建兩個表之間的外鍵約束時遇到問題。InnoDB外鍵定義無法解析列名

這是第一個表:

CREATE TABLE `agews_rifiuti_cer` (
    `id_cer` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `agews_id` int(10) unsigned DEFAULT '0', 
    `livello` tinyint(4) DEFAULT '1', 
    `codice` varchar(10) DEFAULT NULL, 
    `descrizione` varchar(255) DEFAULT NULL, 
    `note` text, 
    `flag_pericoloso` tinyint(1) DEFAULT '0', 
    `id_cliente` int(10) unsigned DEFAULT '1', 
    `flag_modificato` char(1) DEFAULT 'N', 
    PRIMARY KEY (`id_cer`), 
    KEY `fk_id_cliente_agews_sgs_codici_cer` (`id_cliente`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

這裏是第二個:

CREATE TABLE `lin_98_47_rifiuti` (
    `id_rifiuto` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `id_azienda` int(10) unsigned NOT NULL DEFAULT '1', 
    `id_sede` int(10) unsigned NOT NULL DEFAULT '1', 
    `revisione_documento` int(10) unsigned NOT NULL DEFAULT '0', 
    `rifiuto` varchar(255) DEFAULT NULL, 
    `codice_cer` varchar(10) DEFAULT NULL, 
    `nome_interno` varchar(255) DEFAULT NULL, 
    `descrizione` text, 
    `materie_prime` text, 
    `contenitore` text, 
    `deposito` text, 
    `data_ultima_analisi` date DEFAULT NULL, 
    `stato_fisico` enum('Solido pulverulento','Solido non pulverulento','Fangoso palabile','Liquido') DEFAULT 'Solido non pulverulento', 
    `quantita` float(9,1) DEFAULT '0.0', 
    `unita_misura` enum('Kg','l','mc') DEFAULT 'Kg', 
    `id_pericolo` int(10) unsigned DEFAULT NULL, 
    `destino` enum('Recupero','Smaltimento') DEFAULT NULL, 
    `id_recupero` int(10) unsigned DEFAULT NULL, 
    `id_smaltimento` int(10) unsigned DEFAULT NULL, 
    `id_cer` int(10) unsigned DEFAULT NULL, 
    `immagine` varchar(255) DEFAULT NULL, 
    `image_type` varchar(20) DEFAULT NULL, 
    `image_content` mediumblob, 
    `image_size_x` smallint(5) unsigned DEFAULT '0', 
    `image_size_y` smallint(5) unsigned DEFAULT '0', 
    `flag_storico` tinyint(1) DEFAULT '0', 
    `id_responsabile` int(10) unsigned DEFAULT '0', 
    `nome_responsabile` varchar(255) DEFAULT '0', 
    `id_ultima_modifica` int(10) unsigned DEFAULT '0', 
    `create_log` tinyint(1) DEFAULT '1', 
    PRIMARY KEY (`id_rifiuto`,`id_azienda`,`id_sede`,`revisione_documento`), 
    KEY `fk_main_lin_98_47_rifiuti` (`id_azienda`,`id_sede`,`revisione_documento`), 
    KEY `fk_id_responsabile_lin_98_47_rifiuti` (`id_responsabile`,`id_azienda`,`id_sede`,`revisione_documento`,`nome_responsabile`), 
    KEY `fk_id_pericolo_lin_98_47_rifiuti` (`id_pericolo`), 
    KEY `fk_id_recupero_lin_98_47_rifiuti` (`id_recupero`), 
    KEY `fk_id_smaltimento_lin_98_47_rifiuti` (`id_smaltimento`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

的問題發生在我嘗試這樣做:

ALTER TABLE lin_98_47_rifiuti ADD CONSTRAINT fk_id_cer_lin_98_47_rifiuti FOREIGN KEY (id_cer) REFERENCES agews_rifiuti_cer(id_cer) ON UPDATE CASCADE ON DELETE CASCADE; 

我得到這個錯誤:

#1005 - Can't create table 'db_626suite.#sql-71c_13d5' (errno: 150) 

雖然命令SHOW INNODB STATUS說:

Error in foreign key constraint of table db_626suite/#sql-71c_13d5: 
FOREIGN KEY (id_cer) REFERENCES agews_rifiuti_cer(id_cer) ON UPDATE CASCADE ON DELETE CASCADE: 
Cannot resolve column name close to: 
) ON UPDATE CASCADE ON DELETE CASCADE 

但語法和字段的定義似乎正確的給我。我究竟做錯了什麼?

編輯:

馬克乙建議,可能是由於該id_cer被定義爲agews_rifiuti_cerNOT NULL的事實,但我不認爲是這樣的話,其實請考慮這個其他表:

CREATE TABLE `agews_rifiuti_pericolo` (
    `id_pericolo` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `agews_id` int(10) unsigned DEFAULT '0', 
    `codice` varchar(255) DEFAULT NULL, 
    `pericolo` varchar(255) DEFAULT NULL, 
    `note` text, 
    `id_cliente` int(10) unsigned DEFAULT '1', 
    `flag_modificato` char(1) DEFAULT 'N', 
    PRIMARY KEY (`id_pericolo`), 
    KEY `codice_rifiuti_recupero` (`codice`), 
    KEY `fk_id_cliente_rifiuti_pericolo` (`id_cliente`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

這裏id_pericolo如上定義爲NOT NULLid_cer,然而這個完美的作品:

ALTER TABLE lin_98_47_rifiuti ADD CONSTRAINT fk_id_pericolo_lin_98_47_rifiuti FOREIGN KEY (id_pericolo) REFERENCES agews_rifiuti_pericolo(id_pericolo) ON UPDATE CASCADE ON DELETE SET NULL; 

即使lin_98_47_rifiuti領域id_pericolo定義爲DEFAULT NULL

編輯2:

我只是想這個最小設置:

CREATE TABLE `cer` (
    `id_cer` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `codice` varchar(10) DEFAULT NULL, 
    PRIMARY KEY (`id_cer`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `rifiuti` (
    `id_rifiuto` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `id_cer` int(10) unsigned NULL DEFAULT NULL, 
    `rifiuto` varchar(10) DEFAULT NULL, 
    PRIMARY KEY (`id_rifiuto`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE rifiuti ADD FOREIGN KEY (id_cer) REFERENCES cer(id_cer) ON UPDATE CASCADE ON DELETE CASCADE; 

和它的所有工作正常,但我做的不明白我的原始查詢中可能存在什麼問題。

另外我認爲這證明這不是一個定義字段爲NOT NULLDEFAULT NULL的問題。

+0

最小樣本怎麼樣? – Jasper

+0

你需要什麼樣的最小樣本?這不是插入數據的問題,僅僅是表格定義,我已經給出了所有的規格。 –

+0

表中只包含導致問題所需的列的類似插入。你可能會在設置時找到解決方案。 – Jasper

回答

0

我真不明白爲什麼,但所有的表重命名id_cerid_codice,在不改變其定義的同時,解決了這個問題。

所以看起來MySQL似乎有某種特定字段名稱的問題。

1

您在lin_98_47表中定義了id_cerdefault null,但其他表中的匹配FK字段定義爲not null

字段定義必須精確匹配要建立一個外鍵關係,這包括可空:

`id_cer` int(10) unsigned NOT NULL AUTO_INCREMENT, 

`id_cer` int(10) unsigned DEFAULT NULL, 
+0

該死的,打我吧;) – wesside

+0

我不認爲是這樣,請參閱我的編輯。此外,這是我已經做了數百次的思考... –