引用列数必须与引用列匹配

时间:2019-09-10 00:57:52

标签: sql oracle

我对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);

有人知道我为什么收到此错误吗?

3 个答案:

答案 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));