如何在ORACLE SQL中创建该表而不会出现错误?

时间:2018-10-28 04:20:23

标签: sql oracle oracle11g

尝试在ORACLE SQL数据库中创建以下两个表,但是收到ORA-00904。第一张桌子很好,但是第二张桌子拒绝合作,在第一行失败了。请问有什么想法吗?

CREATE TABLE ORDERS
(ORDER_NUMBER VARCHAR(4),
ORDER_DATE DATE CONSTRAINT ORDER_ORDER_DATE_NN NOT NULL,
CUSTOMER_NAME VARCHAR(50) CONSTRAINT ORDER_CUSTOMER_NAME_NN NOT NULL,
POSTAGE NUMBER(4,2) CONSTRAINT ORDER_POSTAGE_NN NOT NULL,
ORDER_TOTAL NUMBER(8,2),
 CONSTRAINT ORDER_NUM_PK PRIMARY KEY (ORDER_NUMBER)
 );



CREATE TABLE ITEMS
(ITEM_NUMBER VARCHAR(3),
ITEM_DESCRIPTION VARCHAR(500) CONSTRAINT ITEMS_ITEM_DESCRIPTION_NN NOT NULL, 
SIZE VARCHAR(1) CONSTRAINT ITEMS_SIZE_NN NOT NULL, 
COST NUMBER(4,2) CONSTRAINT ITEMS_COST_NN NOT NULL,
QUANTITY NUMBER(4) CONSTRAINT ITEMS_QUANTITY_NN NOT NULL, 
ORDER_NUMBER NUMBER(5),
    CONSTRAINT ITEM_ITEM_NUM_PK PRIMARY KEY (ITEM_NUMBER),
    CONSTRAINT ITEM_ORDER_NUM_FK FOREIGN KEY (ORDER_NUMBER)
        REFERENCES ORDERS (ORDER_NUMBER),
);

2 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

CREATE TABLE ORDERS
(
  ORDER_NUMBER NUMBER(5),
  ORDER_DATE DATE CONSTRAINT ORDER_ORDER_DATE_NN NOT NULL,
  CUSTOMER_NAME VARCHAR(50) CONSTRAINT ORDER_CUSTOMER_NAME_NN NOT NULL,
  POSTAGE NUMBER(4,2) CONSTRAINT ORDER_POSTAGE_NN NOT NULL,
  ORDER_TOTAL NUMBER(8,2),
  CONSTRAINT ORDER_NUM_PK PRIMARY KEY (ORDER_NUMBER)
);

CREATE TABLE ITEMS
(
  ITEM_NUMBER VARCHAR2(3),
  ITEM_DESCRIPTION VARCHAR(500) CONSTRAINT ITEMS_ITEM_DESCRIPTION_NN NOT NULL, 
  "SIZE" VARCHAR2(1) CONSTRAINT ITEMS_SIZE_NN NOT NULL, 
  COST NUMBER(4,2) CONSTRAINT ITEMS_COST_NN NOT NULL,
  QUANTITY NUMBER(4) CONSTRAINT ITEMS_QUANTITY_NN NOT NULL, 
  ORDER_NUMBER NUMBER(5),
  CONSTRAINT ITEM_ITEM_NUM_PK PRIMARY KEY (ITEM_NUMBER),
  CONSTRAINT ITEM_ORDER_NUM_FK FOREIGN KEY (ORDER_NUMBER)
        REFERENCES ORDERS (ORDER_NUMBER)
);
  • 引用的列(ORDER_NUMBER)应该是相同的类型。 是否同时使用NUMBERVARCHAR2(4)类型。 (如果两列的两个值都完全由数字值组成,我建议将其存储为NUMBER类型。因为管理NUMBER值比STRING值要好。
  • SIZE是保留关键字。所以把这个名字改成一个合适的名字 例如"SIZE"SIZE_
  • 还有一个逗号需要在结束之前删除 CREATE TABLE ITEMS' 括号

  • VARCHAR2建议使用VARCHAR作为字符串类型变量而不是Oracle

答案 1 :(得分:0)

我的版本是:

create table orders
( order_number       varchar2(4) constraint order_num_pk primary key
, order_date         date not null
, customer_name      varchar2(50) not null
, postage            number(4,2) not null
, order_total        number(8,2)
);

create table items
( item_number        varchar2(3) constraint item_item_num_pk primary key
, item_description   varchar2(500) not null
, order_number       constraint item_order_num_fk references orders (order_number)
, item_size          varchar2(1) not null
, cost               number(4,2) not null
, quantity           number(4) not null
);
  • 虽然为主键,唯一键和(也许)外键赋予显式名称很有用,但命名NOT NULL约束通常被认为是过大的。
  • 在列定义中内联定义单列约束不太冗长,并且还允许FK列继承引用列的数据类型,我个人认为这是最佳实践。
  • 定义名称中实际上不是数字的带有“数字”的列似乎很麻烦,但这是您的数据模型。
  • 如果您既有库存商品又有订单商品,则“ ITEMS”可能会模棱两可,但还是由您自己决定。
  • SIZECREATE CLUSTER语法的一部分,因此不允许用作列名。您可以将其命名为"SIZE"(双引号),但是您每次都必须永远使用这种方式引用它,所以我改用item_size
  • 我使用小写代码,因为它不是COBOL,也不是1974。