试试以下:
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);
你可能已经注意到了, ORDER 是一个SQL关键字,因此您不能将其用于表名。 (你的问题最初是指一个 ORDER 表,但使用的示例代码 ORDERS ,这解决了这个问题但却与之不一致 EMPLOYEE , CUSTOMER 和 PRODUCT 。在我看来,复数名称是正确的,并且对于避免使用SQL关键字也很有用,但这似乎是没有人会同意的。)
ORDER
ORDERS
EMPLOYEE
CUSTOMER
PRODUCT
我认为将单列外键作为列定义的一部分内联定义是一种好习惯,因为我们可以省略数据类型以使其从引用的列继承。
我也做了你的PK专栏 integer 而不是字符串,但这取决于你的系统生成它们。
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 表。
CUSTOMERS
你真的需要存储个人信息( cust_sex )关于你的客户?请记住,这将涉及您在隐私立法合规性问题,如 GDPR 。
cust_sex