嗨,我正在尝试创建一个简单的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。 我该如何解决? 谢谢您
答案 0 :(得分:1)
外键只能引用作为主键或至少具有索引的列(感谢@Uueerdo)。例如:
ALTER TABLE OFFICE ADD CONSTRAINT offnum_unq UNIQUE (NUM_OFFICE);
这将强制引用的列具有唯一值,并在其上创建索引。或者,您也可以这样做:
CREATE INDEX offnum_idx ON OFFICE(NUM_OFFICE);
现在您的第二个CREATE
应该可以工作。
答案 1 :(得分:1)
引用列(您引用为外键的列)应在其中添加索引。您可以将索引添加到“办公室”表中的“ num_office”列,然后尝试创建“ office_phone”表。请参考以下查询
创建表“ office”,并将索引添加到“ num_office”
CREATE TABLE office (
num_office varchar(10) NOT NULL,
name varchar(45),
address varchar(45),
numder varchar(4),
city varchar(45),
INDEX num_office_idx (num_office)
);
或者您可以在创建“办公室”表后使用添加索引
ALTER TABLE office Add Index num_office_indx (num_office);
这将使您可以成功创建带有引用键的“ office_phone”表,该引用键指向“ office”表的“ num_office”列。
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
);
请参阅this页以获取更多详细信息