添加外键有问题

时间:2015-11-01 23:16:57

标签: mysql sql foreign-keys mysql-workbench

我有下一个表格“对话框”:

dialogs

现在我想添加下一个fk:

alter table dialogs add constraint dias_fk foreign key(Receiver) references users (Surname);

但收到了错误:

错误代码:1215。无法添加外键约束

用户表:

enter image description here

我知道,我只能在“用户”和“对话框”表中使用主键列创建fk,但我有auto_increment列,必须是pk。我无法在代码中创建两个原色,但是使用工作台实用程序更改表,看起来我创建了两个没有错误的原色。

我如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

来自名为Using FOREIGN KEY Constraints

的mysql手册页
  

外键和引用键中的对应列必须   有类似的数据类型。整数类型的大小和符号必须是   相同。字符串类型的长度不必相同。对于   非二进制(字符)字符串列,字符集和排序规则   必须是一样的。

     

启用foreign_key_checks时,这是默认设置,   在包含a的表上不允许进行字符集转换   外键约束中使用的字符串列。该   第13.1.6节“ALTER TABLE语法”中描述了解决方法。

     

MySQL要求外键和引用键上的索引   外键检查可以很快,不需要表扫描。在里面   引用表时,必须有一个索引所在的外键   列以相同顺序列为第一列。这样的   如果不是,则会自动在引用表上创建索引   存在。如果您创建,可能会稍后以静默方式删除此索引   另一个可用于强制执行外键约束的索引。   如果给定,则使用index_name,如前所述。

所以你的问题不是专注于PK的问题,而是最左边的索引。另请注意, 45 对于阅读上述内容并不重要。但字符集肯定是一个潜在的问题。

另一个显而易见但我经常忘记的问题是引用的表必须具有一个数据状态,以便开始这样的FK创建。这意味着,数据必须存在,以便在调用引用表之后,可以说FK被引用的表所尊重。

我最后一点的插图

create table referenced
(   -- a.k.a. parent
    id int auto_increment primary key,
    thing varchar(45) not null,
    key(thing)
    -- ok I have 2 indexes not
);
insert referenced (thing) values ('fish');

create table referencing
(   -- a.k.a. child
    id int auto_increment primary key,
    thing varchar(45) not null,
    key(thing)
    -- ok I have 2 indexes not
);
insert referencing (thing) values ('fish'),('frog');

alter table referencing add constraint thing_fk foreign key(thing) references referenced (thing);
  

错误代码:1452。无法添加或更新子行:外键   约束失败(so_gibberish#sql-6cc_41,CONSTRAINT thing_fk   外键(thing)参考referencedthing))0.859秒

该怎么做?

嗯,清理引用,毕竟。

insert referenced(thing) values('frog');

alter table referencing add constraint thing_fk foreign key(thing) references referenced (thing);

- 欢乐时光