我有一个 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
接下来我尝试添加一个表格并插入了这样一条语句(创建表格时没有添加外键,因为有问题):
CREATE TABLE `messages` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`from` bigint(20) NOT NULL,
`to` bigint(20) NOT NULL,
`content` varchar(10000) NOT NULL,
`timestamp_sent` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`timestamp_read` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
创建好数据表后,我需要最终添加外键到 'from'
和 'to'
字段,引用 'users'.'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)
我收到的错误是:
错误:1822错误:无法添加外键约束。在引用表“users”中缺少约束“messages_users_fk”的索引。
但是“users”表在“id”上有一个主要索引...
还尝试了一个更小的步骤,只为“from”字段添加外键:
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:在“消息”表上添加外键约束时失败。FOREIGN KEY约束“cook4food / messages_users_fk”中的选项不正确。
字段类型与其他StackOverflow线程中问题的原因相同(
bigint(20)NOT NULL
)。我的表没有分区(MySQL手册将其作为InnoDB中具有外键约束的限制)。“messages”表当前不存储任何行,因此存储的数据无法以任何方式成为问题。我被卡住了,请帮忙。
CREATE TABLE
语句,可以与它们一起玩耍 :) - Álvaro González