2
CREATE TABLE IF NOT EXISTS `questions` (
  `question_id` int(11) NOT NULL AUTO_INCREMENT,
  `createddate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updateddate` timestamp NULL DEFAULT NULL,
  `active_flag` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`question_id`),
  UNIQUE KEY `id_UNIQUE` (`question_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE `alarts` (
  `alart_id` BIGINT(20) unsigned NOT NULL AUTO_INCREMENT,
  `alart_name` varchar(45) NOT NULL,
  `interval` int(10) unsigned NOT NULL,
  `alart_sent_counter` int(10) unsigned NOT NULL,
  `alart_types_id` BIGINT(20) unsigned NOT NULL,
  `contact_group_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`alart_id`),
  FOREIGN KEY (`alart_types_id`) REFERENCES alart_types(`alart_types_id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

次のような2つのFOREIGN KEYを持つ新しいテーブルを作成したい:

CREATE TABLE `alart_question_mapping` (
`alart_question_mapping_id` BIGINT(20) unsigned NOT NULL AUTO_INCREMENT,  
`question_id` int(11) NOT NULL,
`alart_id` BIGINT(20) unsigned NOT NULL,
PRIMARY KEY (`alart_question_mapping_id`),
FOREIGN KEY (`question_id`) REFERENCES questions(`question_id`),
FOREIGN KEY (`alart_id`) REFERENCES alart_types(`alart_id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

しかし、エラーが発生します: エラー コード: 1005。 テーブル 'alart_question_mapping' を作成できません (errno: 150)

このテーブルを作成するにはどうすればよいですか?

ありがとう。

4

4 に答える 4

2

私が見ることができる唯一のことは、あなたCREATE TABLEが提供したものには存在しないステートメントでテーブルを参照していることです:

FOREIGN KEY (`alart_id`) REFERENCES alart_types(`alart_id`)

この参照を削除すると、テーブルが作成されます。デモで SQL Fiddle を参照してください

編集#1、更新に基づいて、最後のテーブルで間違ったフィールドを参照しているという問題があります。

これを変える:

CREATE TABLE `alart_question_mapping` (
`alart_question_mapping_id` BIGINT(20) unsigned NOT NULL AUTO_INCREMENT,  
`question_id` int(11) NOT NULL,
`alart_id` BIGINT(20) unsigned NOT NULL,
PRIMARY KEY (`alart_question_mapping_id`),
FOREIGN KEY (`question_id`) REFERENCES questions(`question_id`),
FOREIGN KEY (`alart_id`) REFERENCES alart_types(`alart_id`)
) 

これに:

CREATE TABLE `alart_question_mapping` (
`alart_question_mapping_id` BIGINT(20) unsigned NOT NULL AUTO_INCREMENT,  
`question_id` int(11) NOT NULL,
`alart_id` BIGINT(20) unsigned NOT NULL,
PRIMARY KEY (`alart_question_mapping_id`),
FOREIGN KEY (`question_id`) REFERENCES questions(`question_id`),
FOREIGN KEY (`alart_id`) REFERENCES alart_types(`alart_types_id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

したがって、この行を変更しています:

FOREIGN KEY (`alart_id`) REFERENCES alart_types(`alart_id`)

これに:

FOREIGN KEY (`alart_id`) REFERENCES alart_types(`alart_types_id`)

alart_typesテーブルを参照している場合は、 ではalart_types_idなくを参照する必要があります。alart_id

SQL Fiddle with Demoを参照してください

于 2012-09-07T16:04:29.180 に答える
2

ステートメントを変更します。

FOREIGN KEY (`alart_id`) REFERENCES alart_types(`alart_id`)

FOREIGN KEY (`alart_id`) REFERENCES alarts(`alart_id`)
于 2012-09-07T16:10:30.240 に答える
1

テーブルが見つかりませんalart_types

MySQL 外部キー制約から

削除されたテーブルを再作成する場合は、それを参照する外部キー制約に準拠する定義が必要です。前述のように、正しい列名と型が必要であり、参照されたキーにインデックスが必要です。これらが満たされていない場合、MySQL はエラー番号 1005 を返し、エラー メッセージでエラー 150 を参照します。

私はあなたが意味すると思います

FOREIGN KEY (`alart_id`) REFERENCES alart(`alart_id`)

それ以外の

FOREIGN KEY (`alart_id`) REFERENCES alart_types(`alart_id`)

これが理にかなっていることを願っています。

ここに画像の説明を入力

于 2012-09-07T16:05:57.000 に答える
1

この表では

CREATE TABLE alart_types ( 
  alart_types_id BIGINT(20) unsigned NOT NULL AUTO_INCREMENT, 
  alarts_types_name varchar(45) NOT NULL,
  PRIMARY KEY (alart_types_id) 
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

alarts_types_name に一意の制約を設定せずに自動インクリメント ID 番号を設定しても意味がありません。その一意の制約がなければ、データが次のようなテーブルになることはほぼ確実です。

1  Warning
2  Critical
3  Warning
4  Warning

この制約は、存在しない列を参照しています。

FOREIGN KEY (`alart_id`) REFERENCES alart_types(`alart_id`)

そのはず

FOREIGN KEY (`alart_id`) REFERENCES alart_types(`alart_types_id`)
于 2012-09-07T16:18:53.760 に答える