Mysql 错误1005(HY000):Can';t创建表';精明的数据库警报禁用寄存器';(错误编号:150)
我想通过运行下面的SQL在MySQL中创建一个表Mysql 错误1005(HY000):Can';t创建表';精明的数据库警报禁用寄存器';(错误编号:150),mysql,sql,foreign-keys,innodb,create-table,Mysql,Sql,Foreign Keys,Innodb,Create Table,我想通过运行下面的SQL在MySQL中创建一个表 CREATE TABLE IF NOT EXISTS `shrewd_db`.`alert_disable_register` ( `id_alert_disable_register` MEDIUMINT NOT NULL AUTO_INCREMENT, `id_label` MEDIUMINT UNSIGNED NULL, `id_indicator` MEDIUMINT UNSIGNED NULL, `id_user` ME
CREATE TABLE IF NOT EXISTS `shrewd_db`.`alert_disable_register` (
`id_alert_disable_register` MEDIUMINT NOT NULL AUTO_INCREMENT,
`id_label` MEDIUMINT UNSIGNED NULL,
`id_indicator` MEDIUMINT UNSIGNED NULL,
`id_user` MEDIUMINT UNSIGNED NULL,
`active` TINYINT(1) NULL DEFAULT 1,
`id_alert_disable_rule` MEDIUMINT NULL,
`id_escalation_plan` INT NULL,
PRIMARY KEY (`id_alert_disable_register`),
INDEX `id_escalation_plan_alert_rule_idx` (`id_alert_disable_rule` ASC),
INDEX `id_label_idx` (`id_label` ASC),
INDEX `id_indicator_idx` (`id_indicator` ASC),
INDEX `id_user_idx` (`id_user` ASC),
INDEX `id_escalation_plan_idx` (`id_escalation_plan` ASC),
CONSTRAINT `id_label`
FOREIGN KEY (`id_label`)
REFERENCES `shrewd_db`.`escalation_plan` (`id_label`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `id_indicator`
FOREIGN KEY (`id_indicator`)
REFERENCES `shrewd_db`.`escalation_plan` (`id_indicator`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `id_user`
FOREIGN KEY (`id_user`)
REFERENCES `shrewd_db`.`escalation_plan_task_group_has_user` (`id_user`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `id_alert_disable_rule`
FOREIGN KEY (`id_alert_disable_rule`)
REFERENCES `shrewd_db`.`alert_disable_rule` (`id_alert_disable_rule`)
ON DELETE SET NULL
ON UPDATE SET NULL,
CONSTRAINT `id_escalation_plan`
FOREIGN KEY (`id_escalation_plan`)
REFERENCES `shrewd_db`.`escalation_plan` (`id_escalation_plan`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
但我有以下错误
错误1005(HY000):无法创建表
“精明数据库警报禁用寄存器”(错误号:150)
有人能帮我解决这个问题吗,:)
请在下面找到创建其他所需表格的脚本
CREATE TABLE `escalation_plan` (
`id_escalation_plan` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_indicator` mediumint(8) unsigned NOT NULL,
`id_label` mediumint(8) unsigned NOT NULL,
`pressure_waiting_hrs` int(11) NOT NULL DEFAULT '6',
PRIMARY KEY (`id_escalation_plan`),
KEY `fk_escalation_plan_escalation_plan1_idx` (`id_indicator`),
KEY `fk_escalation_plan_label1_idx` (`id_label`),
CONSTRAINT `fk_escalation_plan_escalation_plan1` FOREIGN KEY (`id_indicator`) REFERENCES `indicator` (`id_indicator`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_escalation_plan_label1` FOREIGN KEY (`id_label`) REFERENCES `label` (`id_label`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=152 DEFAULT CHARSET=utf8;
CREATE TABLE `escalation_plan_task_group_has_user` (
`id_escalation_plan_task_has_user` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_user` mediumint(8) unsigned NOT NULL,
`id_escalation_plan_task_group` int(11) NOT NULL,
`text_alert` tinyint(1) NOT NULL DEFAULT '1',
`email_alert` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id_escalation_plan_task_has_user`),
KEY `fk_escalation_plan_task_has_user_user1_idx` (`id_user`),
KEY `fk_escalation_plan_task_group_has_user_escalation_plan_task_idx` (`id_escalation_plan_task_group`),
CONSTRAINT `fk_escalation_plan_task_group_has_user_escalation_plan_task_g1` FOREIGN KEY (`id_escalation_plan_task_group`) REFERENCES `escalation_plan_task_group` (`id_escalation_plan_task_group`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_escalation_plan_task_has_user_user1` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=3605 DEFAULT CHARSET=utf8;
CREATE TABLE `alert_disable_rule` (
`id_alert_disable_rule` mediumint(9) NOT NULL AUTO_INCREMENT,
`disable_in_weekend` tinyint(1) DEFAULT '0',
`start_date` datetime DEFAULT NULL,
`end_date` datetime DEFAULT NULL,
`start_time` decimal(10,0) DEFAULT NULL,
`end_time` decimal(10,0) DEFAULT NULL,
PRIMARY KEY (`id_alert_disable_rule`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
为了使外键约束成功,除其他外,必须满足以下条件:
`alert_disable_register`.`id_escalation_plan`-- signed int
`escalation_plan`.`id_escalation_plan` -- unsigned int
请注意,显示宽度(括号中的数字)和可空性并不重要
从Mysql手册页面:
外键和引用键中的相应列必须
具有相似的数据类型。整数类型的大小和符号必须为
相同的。字符串类型的长度不必相同。对于
非二进制(字符)字符串列、字符集和排序规则
一定是一样的
MySQL需要外键和引用键的索引,以便
外键检查可以很快,不需要扫描表。在
引用表时,必须有外键所在的索引
列按相同顺序列为第一列
外键和引用键中的相应列必须
具有相似的数据类型。整数类型的大小和符号必须为
相同的。字符串类型的长度不必相同。对于
非二进制(字符)字符串列、字符集和排序规则
一定是一样的
还要注意,满足FK关系的引用表键不需要是主键,甚至不需要是唯一键。只需满足排序中的第一个most(也称为left-most2)
同样,索引不是你的问题,但它通常是为其他人
对于那些需要在创建表之后添加外键约束的人,请使用以下语句
以下测试将正常运行。不过,您需要自己决定如何处理更改。您缺少提供的一些表,这些表需要在前两个表中删除一些FK约束
create database xyztest123;
use xyztest123;
CREATE TABLE `escalation_plan` (
`id_escalation_plan` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_indicator` mediumint(8) unsigned NOT NULL,
`id_label` mediumint(8) unsigned NOT NULL,
`pressure_waiting_hrs` int(11) NOT NULL DEFAULT '6',
PRIMARY KEY (`id_escalation_plan`),
KEY `fk_escalation_plan_escalation_plan1_idx` (`id_indicator`),
KEY `fk_escalation_plan_label1_idx` (`id_label`)
-- CONSTRAINT `fk_escalation_plan_escalation_plan1` FOREIGN KEY (`id_indicator`) REFERENCES `indicator` (`id_indicator`) ON DELETE NO ACTION ON UPDATE NO ACTION,
-- CONSTRAINT `fk_escalation_plan_label1` FOREIGN KEY (`id_label`) REFERENCES `label` (`id_label`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=152 DEFAULT CHARSET=utf8;
CREATE TABLE `escalation_plan_task_group_has_user` (
`id_escalation_plan_task_has_user` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_user` mediumint(8) unsigned NOT NULL,
`id_escalation_plan_task_group` int(11) NOT NULL,
`text_alert` tinyint(1) NOT NULL DEFAULT '1',
`email_alert` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id_escalation_plan_task_has_user`),
KEY `fk_escalation_plan_task_has_user_user1_idx` (`id_user`),
KEY `fk_escalation_plan_task_group_has_user_escalation_plan_task_idx` (`id_escalation_plan_task_group`)
-- CONSTRAINT `fk_escalation_plan_task_group_has_user_escalation_plan_task_g1` FOREIGN KEY (`id_escalation_plan_task_group`) REFERENCES `escalation_plan_task_group` (`id_escalation_plan_task_group`) ON DELETE NO ACTION ON UPDATE NO ACTION,
-- CONSTRAINT `fk_escalation_plan_task_has_user_user1` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=3605 DEFAULT CHARSET=utf8;
CREATE TABLE `alert_disable_rule` (
`id_alert_disable_rule` mediumint(9) NOT NULL AUTO_INCREMENT,
`disable_in_weekend` tinyint(1) DEFAULT '0',
`start_date` datetime DEFAULT NULL,
`end_date` datetime DEFAULT NULL,
`start_time` decimal(10,0) DEFAULT NULL,
`end_time` decimal(10,0) DEFAULT NULL,
PRIMARY KEY (`id_alert_disable_rule`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `alert_disable_register` (
`id_alert_disable_register` MEDIUMINT NOT NULL AUTO_INCREMENT,
`id_label` MEDIUMINT UNSIGNED NULL,
`id_indicator` MEDIUMINT UNSIGNED NULL,
`id_user` MEDIUMINT UNSIGNED NULL,
`active` TINYINT(1) NULL DEFAULT 1,
`id_alert_disable_rule` MEDIUMINT NULL,
`id_escalation_plan` INT unsigned NULL,
PRIMARY KEY (`id_alert_disable_register`),
INDEX `id_escalation_plan_alert_rule_idx` (`id_alert_disable_rule` ASC),
INDEX `id_label_idx` (`id_label` ASC),
INDEX `id_indicator_idx` (`id_indicator` ASC),
INDEX `id_user_idx` (`id_user` ASC),
INDEX `id_escalation_plan_idx` (`id_escalation_plan` ASC),
CONSTRAINT `id_label`
FOREIGN KEY (`id_label`) -- MEDIUMINT UNSIGNED
REFERENCES `escalation_plan` (`id_label`) -- mediumint(8) unsigned , -- Index OK?: Yes
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `id_indicator`
FOREIGN KEY (`id_indicator`) -- MEDIUMINT UNSIGNED
REFERENCES `escalation_plan` (`id_indicator`) -- mediumint(8) unsigned, -- Index OK?: Yes
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `id_user`
FOREIGN KEY (`id_user`) -- MEDIUMINT UNSIGNED
REFERENCES `escalation_plan_task_group_has_user` (`id_user`) -- mediumint(8) unsigned, -- Index OK?: Yes
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `id_alert_disable_rule`
FOREIGN KEY (`id_alert_disable_rule`) -- MEDIUMINT
REFERENCES `alert_disable_rule` (`id_alert_disable_rule`) -- mediumint(9), -- Index OK?: Yes
ON DELETE SET NULL
ON UPDATE SET NULL,
CONSTRAINT `id_escalation_plan`
FOREIGN KEY (`id_escalation_plan`) -- INT
REFERENCES `escalation_plan` (`id_escalation_plan`) -- int(10) unsigned, Index OK?: Yes
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
drop database xyztest123;
1类似和允许的列差异、字符串数据
2最左边/最前面的索引排序
单列上的索引(也称为键)是最左边的,因为它不是复合索引
如果父(引用)表中的多列索引(也称为复合索引)的列顺序与外键(FK)关系中依赖它的子表键的顺序相同,则最令人满意。即使父复合键中的列数大于子复合键的列数。见下面的例子
假设子(引用)表具有按(col1,col4)
排序的复合键FK需求,则
(col1、col2、col3、col4)
排序的父复合键不满足最左边的要求(col1,col4,col3,…)
排序的父复合键满足最左边的要求CREATE table
的语句对于FK关系将失败。创建表的尝试将失败,错误代码为1215
同样,存在子级的
ALTER TABLE
在尝试在事实发生后添加FK关系时也会失败。您是否已经创建了此表上报计划
?也发布了升级计划的创建表代码。您好1000111,我用其他表脚本更新了问题,谢谢!数据类型必须完全匹配。在您的情况下,id\u escalation\u plan INT NULL
必须是未签名的
。确保以“正确”的顺序创建表。不要忘记向上投票、向下投票,如果合适,请接受答案。甚至像“这是垃圾,毫无意义”这样的反馈。我们利用这些反馈,鼓励我们帮助下一个人,不管是什么。
drop table if exists a2; -- must do in reverse order
drop table if exists a1;
create table a1
( id int auto_increment primary key,
thing varchar(100) not null,
key `keyname001` (thing)
)ENGINE = InnoDB;
create table a2
( id int auto_increment primary key,
myThing char(40) not null, -- similar and allowable datatype
foreign key `fk_002` (myThing) references a1(thing)
)ENGINE = InnoDB;
insert a2(myThing) values ('a'); -- error 1452, FK violation
insert a1(thing) values ('a'); -- ok
insert a2(myThing) values ('a'); -- ok, not FK violation
-- now a redo below to show it slightly different
drop table if exists a2; -- must do in reverse order
drop table if exists a1;
create table a1
( id int auto_increment primary key,
thing varchar(100) not null,
key `keyname001` (thing)
)ENGINE = InnoDB;
create table a2
( id int auto_increment primary key,
myThing varchar(30) not null, -- similar and allowable datatype
key(myThing),
foreign key `fk_002` (myThing) references a1(thing)
)ENGINE = InnoDB;
insert a2(myThing) values ('a'); -- error 1452, FK violation
insert a1(thing) values ('a'); -- ok
insert a2(myThing) values ('a'); -- ok, not FK violation