无法在mysql上创建外键
嗨,我正在尝试创建一个简单的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
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。未能添加外键约束。缺少约束的索引。