你好,我有这个 SQL 代码:
create table expedition(
name varchar(50) ,
subject varchar(50) ,
timespan float not null ,
location varchar(50) ,
primary key(name,subject,timespan,location)
);
create table county(
name varchar(50) ,
primary key(name)
);
create table person(
address varchar(50) ,
primary key(address)
);
create table representative(
id integer unique not null ,
name varchar(50) ,
primary key(id)
);
create table company(
id integer unique not null ,
name varchar(50) ,
afm varchar(50) ,
address varchar(50) ,
sizey integer not null ,
primary key(address,afm) ,
foreign key(id) references representative(id)
);
create table representator(
id integer not null ,
nameOrAddress varchar(50) ,
primary key(id) ,
foreign key(nameOrAddress) references county(name) ,
foreign key(nameOrAddress) references person(address)
);
create table organiser(
nameOrAddress varchar(50) ,
id integer not null ,
primary key(id) ,
foreign key(nameOrAddress) references company(name) ,
foreign key(nameOrAddress) references person(address)
);
当我尝试运行此程序时,出现此错误:
`第 41 行出现错误 1822 (HY000):无法添加外键约束。引用表“company”中缺少约束“organiser_ibfk_1”的索引
[执行完成,退出代码 1]`
是因为名称不是公司的主键吗?
而且我有相同名称的不同实体的属性,我继续使用单词
"id"
来表示不同的实体。
我知道在表的声明中,属性
"id"
是本地的,但是当我使用引用外键时,例如这里:
`创建表公司( ... 外键(id) 参考代表(id) ... );
显然我希望
"id"
的 "representative(id)"
不是表公司的局部变量,而是表代表的局部变量,那么我的语法是否正确?如果不是,我应该如何更改它?
`
是因为名称不是公司的主键吗?
是的。外键必须引用所引用表的主键或非空唯一键。
但这只是您示例中的问题之一。
另一个问题是您尝试使用外键约束进行多态关联(例如
nameOrAddress
)。通过使用引用不同表的两个外键,您需要 nameOrAddress
列中的值存在于 both 引用表的键中。我怀疑这就是你的意图。基本上,如果您使用多态关联,您不能使用外键约束。
您还会对列名称的范围感到困惑,例如
id
。你举个例子:
create table company( ... foreign key(id) references representative(id) ... );
请放心,第一个
id
是 company
表中的外键列,第二个 id
实际上是 representative
表的主键列。