用复合主键创建表

时间:2018-09-27 04:16:51

标签: sql oracle

我正在尝试创建表(ORDERS)。该表将以客户(CNO),产品(PNO),员工(ENO)和order_number(ONO)作为主键。我在创建Orders表时遇到问题。

注意:CNO,PNO和ENO将成为ORDERS表中的组合键:

CREATE TABLE EMPLOYEE
(ENO VARCHAR2(3)
,emp_fname VARCHAR2(20)
,emp_lname  VARCHAR2(20)
,job_title VARCHAR2(20)
,emp_sex VARCHAR2(1)
,emp_DOB date
,emp_status VARCHAR2(10)
,PRIMARY KEY (ENO)
);

CREATE TABLE CUSTOMER
(CNO VARCHAR2(3) 
,Cust_fname VARCHAR2(20)
,Cust_lname  VARCHAR2(20)
,Cust_SEX VARCHAR2(1)
,Cust_order_date VARCHAR2(14)
,Cust_ship_date date
,PRIMARY KEY (CNO)
);

CREATE TABLE PRODUCT
(PNO VARCHAR2(4)
,Prod_category VARCHAR2(20)
,Prod_name VARCHAR2(50)
,UnitrPrice number(20)
,Unitcost number(20)
,PRIMARY KEY (PNO)
);

CREATE TABLE ORDERS
(ONO VARCHAR2(4) 
,Order_QTY number(30)
,ENO VARCHAR2(3) NOT NULL
,PNO VARCHAR2(4) NOT NULL
,CNO VARCHAR2(3) NOT NULL
,CONSTRAINT ORDER_LINE_ENO_FK FOREIGN KEY (ENO) REFERENCES EMPLOYEE (ENO),
,CONSTRAINT ORDERS_LINE_FK FOREIGN KEY (CNO) REFERENCES CUSTOMER (CNO),
,CONSTRAINT ORDERS_LINE_FK FOREIGN KEY (PNO) REFERENCES PRODUCT (PNO)
,PRIMARY KEY (CNO,ENO,PNO)
);

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

CREATE TABLE ORDERS
(ONO VARCHAR(4) 
,Order_QTY int
,ENO VARCHAR(3) NOT NULL
,PNO VARCHAR(4) NOT NULL
,CNO VARCHAR(3) NOT NULL
,PRIMARY KEY (CNO,ENO,PNO)
);

alter table ORDERS add CONSTRAINT ORDER_LINE_ENO_FK FOREIGN KEY (ENO) REFERENCES EMPLOYEE (ENO);
alter table ORDERS add CONSTRAINT ORDERS_LINE_FK FOREIGN KEY (CNO) REFERENCES CUSTOMER (CNO);
alter table ORDERS add CONSTRAINT ORDERS_LINE_FK FOREIGN KEY (PNO) REFERENCES PRODUCT (PNO);

答案 1 :(得分:0)

您可能已经注意到,ORDER是一个SQL关键字,因此您不能将其用作表名。 (您的问题最初是指向ORDER表的,但是您的示例代码使用了ORDERS,该问题已解决,但与EMPLOYEECUSTOMERPRODUCT不一致在我看来,复数名称是正确的,而且对于避免使用SQL关键字很有用,但这似乎是没人会同意的东西。)

我认为最好将内联单列外键定义为列定义的一部分,因为这样我们就可以省去数据类型,使其从引用的列继承。

我也将您的PK列设为integer而不是字符串,尽管这取决于您系统生成它们的原因。

create table employees
( eno              integer primary key
, emp_fname        varchar2(20)
, emp_lname        varchar2(20)
, job_title        varchar2(20)
, emp_sex          varchar2(1)
, emp_dob          date
, emp_status       varchar2(10)
);

create table customers
( cno integer      primary key
, cust_fname       varchar2(20)
, cust_lname       varchar2(20)
, cust_sex         varchar2(1)
, cust_order_date  varchar2(14)
, cust_ship_date   date
);

create table products
( pno              integer primary key
, prod_category    varchar2(20)
, prod_name        varchar2(50) not null
, unitrprice       number(20)
, unitcost         number(20)
);

create table orders
( ono             integer
, order_qty       number(30)
, eno             not null constraint order_emp_fk references employees (eno)
, pno             not null constraint orders_prod_fk references products (pno)
, cno             not null constraint order_cust_fk references customers (cno)
, primary key (cno,eno,pno)
);

CUSTOMERS包含订单和发货日期似乎很奇怪。如果客户下达多个订单怎么办?这些可能应该是ORDERS表的一部分。

您是否真的需要存储有关您的客户的个人信息(cust_sex)?请记住,这将涉及诸如GDPR之类的隐私法规合规性问题。