Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-无法添加外键_Mysql_Key_Add - Fatal编程技术网

MySQL-无法添加外键

MySQL-无法添加外键,mysql,key,add,Mysql,Key,Add,我在MySQL InnoDB中创建了这样一个表: CREATE TABLE `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `type` enum('MANUAL','FACEBOOK') NOT NULL DEFAULT 'MANUAL', `role` enum('COOK','HOST','ALL') NOT NULL DEFAULT 'ALL', `about_me` varchar(1000) DEFAULT NUL

我在MySQL InnoDB中创建了这样一个表:

CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `type` enum('MANUAL','FACEBOOK') NOT NULL DEFAULT 'MANUAL',
  `role` enum('COOK','HOST','ALL') NOT NULL DEFAULT 'ALL',
  `about_me` varchar(1000) DEFAULT NULL,
  `food_preferences` varchar(1000) DEFAULT NULL,
  `cooking_experience` varchar(1000) DEFAULT NULL,
  `with_friend` bit(1) DEFAULT b'0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
接下来,我尝试使用这样的语句添加一个表(在创建表时没有添加外键,因为它有问题):

创建表之后,我需要在引用
'users'的
'from'和
'to'字段上添加外键。'id'
字段:

ALTER TABLE `messages` 
  ADD CONSTRAINT `messages_users_fk`
  FOREIGN KEY (`from` , `to` )
  REFERENCES `users` (`id` , `id` )
  ON DELETE SET NULL
  ON UPDATE CASCADE
, ADD INDEX `messages_users_fk_idx` (`from` ASC, `to` ASC)
ALTER TABLE `messages` 
  ADD CONSTRAINT `messages_users_fk`
  FOREIGN KEY (`from` )
  REFERENCES `users` (`id` )
  ON DELETE SET NULL
  ON UPDATE CASCADE
, ADD INDEX `messages_users_fk_idx` (`from` ASC) ;
我得到的错误是:

错误:错误1822:未能添加外键约束。引用的表“users”中缺少约束“messages\u users\u fk”的索引

但是“用户”表在
'id'
上有一个
主索引

还尝试了一个较小的步骤,仅为
'from'
字段添加外键:

ALTER TABLE `messages` 
  ADD CONSTRAINT `messages_users_fk`
  FOREIGN KEY (`from` , `to` )
  REFERENCES `users` (`id` , `id` )
  ON DELETE SET NULL
  ON UPDATE CASCADE
, ADD INDEX `messages_users_fk_idx` (`from` ASC, `to` ASC)
ALTER TABLE `messages` 
  ADD CONSTRAINT `messages_users_fk`
  FOREIGN KEY (`from` )
  REFERENCES `users` (`id` )
  ON DELETE SET NULL
  ON UPDATE CASCADE
, ADD INDEX `messages_users_fk_idx` (`from` ASC) ;
错误略有不同:

错误:错误1825:未能在表“messages”上添加外键约束。外键约束“cook4food/messages\u users\u fk”中的选项不正确


字段的类型与其他StackOverflow线程中的问题原因相同(
bigint(20)NOT NULL
)。我的表没有分区(MySQL手册将此列为InnoDB中外键约束的限制)。
'messages'
表当前未存储任何行,因此存储的数据不会以任何方式成为问题。我卡住了,请帮助。

参考资料
用户
id
id

您正试图创建无效的外键(id,id)。复合索引中涉及的列(涉及多个列的列)不能是同一列,重复。至少我从未见过


创建两个单独的外键,一个用于FROM,另一个用于TO,每个外键都指向用户。

如果您有相应的权限,可以发出以下查询:

SHOW ENGINE innodb STATUS
。。。这将告诉您(以及其他一些信息)错误的确切细节:

------------------------
最新外键错误
------------------------
130311 13:30:06表test/#sql-71c_6的外键约束中存在错误:
外键(`from`、`to`)
引用`users`(`id`,`id`)
关于删除集NULL
关于更新级联
,添加索引“messages\u users\u fk\u idx”(`from`ASC,`至`ASC):
您已经定义了一个SET NULL条件,尽管
列被定义为非空。
删除父记录时,不能将子记录设为NULL,因为列
不为NULL

  `from` bigint(20) NOT NULL,
  `to` bigint(20) NOT NULL,
编辑:此外,我看不出单个组合键的用途。我想您需要两个单键。

正如我们所看到的

当子列
from
to
不为空时,不能在子记录中定义SET NULL

因此,如果您尝试使用以下两条语句创建外键,则应该在
messages
表中包含外键

1>

2>


希望这些语句对您有所帮助。

+1很高兴看到实际的
创建表
语句来使用它们:)StackOverflow社区一如既往地有用且快速:-)。我现在明白我的错误了,谢谢!如果
显示引擎innodb状态
没有显示最新外键错误,你有什么想法吗?谢谢+1阿拉瓦罗。你救了我第二个晚上!再次感谢,谢谢,阿尔瓦罗·冈萨雷斯。我能很快发现我的错误。是的,我在想这两种方法之间的区别。我真正需要的是单独的外键。谢谢
ALTER TABLE `messages`  ADD CONSTRAINT `messages_users_to_fk`   FOREIGN KEY (`to` )   REFERENCES `users` (`id` )  ON DELETE CASCADE ON UPDATE CASCADE, ADD INDEX `messages_users_fk_to_idx` (`to` ASC) ;