【发布时间】:2015-03-26 20:26:23
【问题描述】:
我有 3 张桌子:
1) SERVICE_REQUESTS(父)
CREATE TABLE SERVICE_REQUESTS(
service_id NUMBER (7) NOT NULL,
serial_number NUMBER (10) NOT NULL,
service_date DATE NOT NULL,
service_description VARCHAR(50) NOT NULL,
hourly_rate NUMBER(5,2) NOT NULL,
customer_id NUMBER (5) NOT NULL,
employee_id NUMBER (3) NOT NULL,
CONSTRAINT service_request_pk PRIMARY KEY(service_id, serial_number));
2)SERVICE_PARTS(解决M:M关系的关联实体)
CREATE TABLE SERVICE_PARTS(
service_id NUMBER (7) NOT NULL,
part_id NUMBER (10) NOT NULL,
quantity NUMBER (4) NOT NULL,
unit_cost NUMBER(7,2) NOT NULL,
CONSTRAINT service_part_pk PRIMARY KEY(service_id, part_id));
3) 部分(父)
CREATE TABLE PARTS(
part_id NUMBER (10) NOT NULL,
part_description VARCHAR(50) NOT NULL,
cost NUMBER(7,2) NOT NULL,
quantity_on_hand NUMBER (5) NOT NULL,
CONSTRAINT part_pk PRIMARY KEY(part_id));
我使用以下语句创建了一个从 SERVICE_PARTS 到 PARTS 的外键约束:
ALTER TABLE service_parts
ADD CONSTRAINT service_parts_part_id_fk
FOREIGN KEY (part_id)
REFERENCES parts(part_id);
现在我正在尝试使用以下语句创建从 SERVICE_PARTS 到 SERVICE_REQUESTS 的外键约束:
ALTER TABLE service_parts
ADD CONSTRAINT service_parts_service_id_fk
FOREIGN KEY (service_id)
REFERENCES service_requests(service_id);
但我收到以下错误:ORA-02270: no matching unique or primary key for this column-list。为什么它允许为part_id而不是service_id添加约束?
我附上了我的 ER 图以进行视觉澄清:
【问题讨论】:
-
您问题中的图表和文字冲突。该图有一个
SERVICE_REQUEST表,主键为service_id,但文本描述的表名称为SERVICE_REQUESTS,主键为(service_id, serial_number)。那么哪个是正确的?请更新图表或文字。 -
嗨,鲍勃,感谢您提出这个问题。我们在课堂上使用的程序隐藏了识别主键。
SERVICE_REQUEST表右侧的>|----中的|表示EQUIPMENT表中的主键也被用作SERVICE_REQUEST表中的主键/外键。与SERVICE_PART表类似,它有2 个>|--和--|<来自SERVICE_REQUEST实体和PART实体。这意味着SERVICE_PART表中的主数据库由SERVICE_REQUEST和PART实体标识。
标签: oracle foreign-keys many-to-many constraints composite-key