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;

我想用两个 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”(错误号: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 回答