我对SQL比较陌生,并且不断收到以下错误“外键引用列表中的列数不等于引用列表中的列数。”
create table client
(name varchar(30),
phone int,
city varchar(20),
state char(2) CHECK(state='MN' OR state='ND' OR state='SD' OR state='WI' or state='IA'),
primary key(name,phone));
create table owns_vehicle
(name varchar(30),
phone int,
vin varchar(10),
primary key(name, phone, vin),
foreign key(name,phone) references client);
create table service_appointment
(mydate date,
vin varchar(10),
mechanic varchar(15),
description varchar(30) NOT NULL,
cost int CHECK (cost>=0),
primary key(mydate,vin),
foreign key(vin) references owns_vehicle);
这是引起问题的行:
foreign key(vin) references owns_vehicle);
有人知道我为什么收到此错误吗?
答案 0 :(得分:1)
您尝试引用owns_vehicle
,因此需要引用所有表PRIMARY KEY
的列,即name, phone, vin
。但是您的外键只有vin
,因此缺少两列(name, phone
)。
答案 1 :(得分:0)
主键包含三个部分。您需要引用所有这些。如果要使用此模型,则需要其他两个组件:
create table service_appointment (
mydate date,
name varchar(30),
phone int,
vin varchar(10),
mechanic varchar(15),
description varchar(30) NOT NULL,
cost int CHECK (cost>=0),
primary key(mydate,vin),
foreign key(name, phone, vin) references owns_vehicle (name, phone, vin)
);
但是,我认为您的数据模型应该改变。 VIN可以更改所有者。人们可以更改电话号码。这些似乎不是主键的好组件。
答案 2 :(得分:0)
如果您假设车辆在给定时间只能有一个所有者,则可以通过更改owns_vehicle
使其对VIN
具有唯一性约束来使当前数据模型正常工作:
CREATE TABLE OWNS_VEHICLE
(NAME VARCHAR2(30),
PHONE INT,
VIN VARCHAR2(10),
CONSTRAINT PK_OWNS_VEHICLE
PRIMARY KEY(NAME, PHONE, VIN)
USING INDEX,
CONSTRAINT OWNS_VEHICLE_UQ1
UNIQUE(VIN)
USING INDEX,
CONSTRAINT OWNS_VEHICLE_FK1
FOREIGN KEY(NAME,PHONE) REFERENCES CLIENT(NAME, PHONE));