1

2 つのテーブル間の外部キー制約の作成に問題があります。

最初の表は次のとおりです。

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;

そして、ここに2番目のものがあります:

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

しかし、構文とフィールドの定義は正しいようです。私は何を間違っていますか?

編集:

マーク Bid_cerは、が で定義されNOT NULLていることが原因である可能性があると示唆しましたagews_rifiuti_cerが、私はそうではないと思います。実際、次の別の表を検討してください。

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 NULLていますid_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 NULLまた、これは、フィールドをorとして定義する問題ではないことを証明していると思いますDEFAULT NULL

4

2 に答える 2

2

lin_98_47 テーブルのように定義id_cerdefault nullましたが、他のテーブルの一致する FK フィールドは として定義されていnot nullます。

フィールド定義は、外部キー関係を確立するために正確に一致する必要があり、これには null 可能性が含まれます。

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

`id_cer` int(10) unsigned DEFAULT NULL,
于 2012-11-08T17:05:04.200 に答える
0

理由はよくわかりませんが、定義を変更せずにすべてのテーブルで に名前を変更すると、問題が解決しましたid_cerid_codice

そのため、MySQL にはその特定のフィールド名に何らかの問題があったようです。

于 2012-11-09T08:02:24.373 に答える