无法在mysql上创建外键

无法在mysql上创建外键,mysql,Mysql,嗨,我正在尝试创建一个简单的MySQL数据库。我写下面的脚本 CREATE TABLE office ( num_office varchar(10) NOT NULL, name varchar(45), address varchar(45), numder varchar(4), city varchar(45) ); CREATE TABLE office_phone( n_office varchar(10) NOT NULL, phone var

嗨,我正在尝试创建一个简单的MySQL数据库。我写下面的脚本

CREATE TABLE office (
   num_office varchar(10) NOT NULL,
   name varchar(45),
   address varchar(45),
   numder varchar(4),
   city varchar(45)
 );



CREATE TABLE office_phone(
n_office varchar(10) NOT NULL,
phone varchar(15) NOT NULL,
PRIMARY KEY(n_office,phone),
FOREIGN KEY (n_office) REFERENCES office(num_office)
ON DELETE RESTRICT 
ON UPDATE CASCADE
);
但出现了错误代码1822。 我怎样才能修好它?
andvance中的thank you

外键只能引用主键列或至少有索引的列(谢谢@uuerdo)。例如:

ALTER TABLE OFFICE ADD CONSTRAINT offnum_unq UNIQUE (NUM_OFFICE);
这将强制引用的列具有唯一的值,并在其上创建索引。或者你也可以这样做:

CREATE INDEX offnum_idx ON OFFICE(NUM_OFFICE);

现在,您的第二个
CREATE
应该可以工作了。

外键只能引用主键列或至少有索引的列(谢谢@uuerdo)。例如:

ALTER TABLE OFFICE ADD CONSTRAINT offnum_unq UNIQUE (NUM_OFFICE);
这将强制引用的列具有唯一的值,并在其上创建索引。或者你也可以这样做:

CREATE INDEX offnum_idx ON OFFICE(NUM_OFFICE);
现在,您的第二个
创建
应该可以工作了。

引用列(作为外键引用的列)应该添加索引。您可以将索引添加到“office”表中的“num\u office”列,然后尝试创建“office\u phone”表。请参阅以下查询

创建表“office”,将索引添加到“num_office”

))

或者,您可以在使用创建“office”表后添加索引

ALTER TABLE office Add Index num_office_indx (num_office);
这将允许您成功地创建表“office\u phone”,引用键指向“office”表的“num\u office”列

有关更多详细信息,请参阅第页。

参考列(作为外键引用的列)应添加索引。您可以将索引添加到“office”表中的“num\u office”列,然后尝试创建“office\u phone”表。请参阅以下查询

创建表“office”,将索引添加到“num_office”

))

或者,您可以在使用创建“office”表后添加索引

ALTER TABLE office Add Index num_office_indx (num_office);
这将允许您成功地创建表“office\u phone”,引用键指向“office”表的“num\u office”列


更多详细信息请参见页面

轻微更正:在MySQL中,引用的列(或列组合)只需要索引;不要求索引强制唯一性。@Uueerdo您是对的。我确定了我的答案。我总是将FKs与PKs或UNQ列一起使用,所以以前没有注意到这一点。谢谢是的,您实际上想要引用非唯一索引的情况是相当罕见的;不要求索引强制唯一性。@Uueerdo您是对的。我确定了我的答案。我总是将FKs与PKs或UNQ列一起使用,所以以前没有注意到这一点。谢谢是的,您实际上想要引用非唯一索引的情况非常罕见。完整的错误消息说明了一切:
错误代码:1822。未能添加外键约束。缺少约束索引。
完整的错误消息说明了一切:
错误代码:1822。未能添加外键约束。缺少约束的索引。