我正在尝试创建表(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)
);
答案 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
,该问题已解决,但与EMPLOYEE
,CUSTOMER
和PRODUCT
不一致在我看来,复数名称是正确的,而且对于避免使用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之类的隐私法规合规性问题。