【问题标题】:ORACLE - Creating multiple tables with same column namesORACLE - 创建具有相同列名的多个表
【发布时间】:2020-02-06 02:30:01
【问题描述】:

我正在尝试创建 8 个表: 类别 顾客 雇员 产品 订单详细信息 托运人 供应商 供应商

其中一些将具有相同的列名称,例如供应商和客户中的 CompanyName。

但是,当我运行代码时,它给了我错误:

ORA-00907: 缺少右括号 或者: ORA-00955: 名称已被现有对象使用

我该如何解决这个问题?

below is my code:

    CREATE TABLE CATEGORIES 
(

    CATEGORYID NUMBER(8,0),
    CATEGORYNAME VARCHAR2(15) NOT NULL,
    CATEGORYCODE NUMBER(6,0),
    DESCRIPTION VARCHAR2(300),
    CONSTRAINT CATEGORIES_CATEGORYID_PK PRIMARY KEY (CATEGORYID)
);


CREATE TABLE CUSTOMERS 
(
    CUSTOMERID CHAR(5),
    COMPANYNAME VARCHAR2(40) NOT NULL,
    CONTACTNAME VARCHAR2(30),
    CONTACTTITLE VARCHAR2(30),
    ADDRESS VARCHAR2(30),
    CITY VARCHAR2(15),
    REGION VARCHAR2(15),
    POSTALCODE VARCHAR2(10),
    COUNTRY VARCHAR2(15),
    PHONE VARCHAR2(24),
    FAX VARCHAR2(24),
    EMAIL VARCHAR2(50),
    CONSTRAINT CUSTOMERS_CUSTOMERID_PK PRIMARY KEY(CUSTOMERID) 
);


CREATE TABLE EMPLOYEES
(
    EMPLOYEEID NUMBER(8,0),
    LASTNAME VARCHAR2(20) NOT NULL,
    FIRSTNAME VARCHAR2(10) NOT NULL,
    TITLE VARCHAR2(30),
    TITLEOFCOURTESY VARCHAR2(25),
    BIRTHDATE DATE(7),
    HIREDATE DATE(7),
    ADDRESS VARCHAR2(60),
    CITY VARCHAR2(15),
    REGION VARCHAR2(15),
    POSTALCODE VARCHAR2(10),
    COUNTRY VARCHAR2(15),
    HOMEPHONE VARCHAR2(24),
    EXTENSION VARCHAR2(4),
    NOTES VARCHAR2(600),
    REPORTSTO NUMBER(8,0),
    SIN CHAR(9),
    CONSTRAINT EMLOYEES_EMPLOYEEID_PK PRIMARY KEY(EMPLOYEEID)


);


CREATE TABLE ORDERDETAILS
(
    ORDERID NUMBER(8,0),
    PRODUCTID NUMBER(8,0),
    UNITPRICE NUMBER(8,2) NOT NULL,
    QUANTITY NUMBER(6,0) NOT NULL,
    DISCOUNT NUMBER(2,2) NOT NULL,
CONSTRAINT ORDERDETAILS_ORDERID_PRODUCTID_PK PRIMARY KEY (ORDERID, PRODUCTID)

);


CREATE TABLE ORDERS
(
    ORDERID NUMBER(8,0),
    CUSTOMERID CHAR(5),
    EMPLOYEEID NUMBER(22),
    TERRITORYID VARCHAR2(20),
    ORDERDATE DATE(7),
    REQUIREDATE DATE(7),
    SHIPPEDDATE DATE(7),
    SHIPVIA NUMBER(8,0),
    FREIGHT NUMBER(8,2),
    SHIPNAME VARCHAR2(40),
    SHIPADDRESS VARCHAR2(60),
    SHIPCITY VARCHAR2(15),
    SHIPREGION VARCHAR2(15),
    SHIPPOSTALCODE VARCHAR2(10),
    SHIPCOUNTRY VARCHAR2(15),
    CONSTRAINT ORDERS_ORDERID_PK PRIMARY KEY(ORDERID),
    CONSTRAINT ORDERS_CUSTOMERID_FK FOREIGN KEY (CUSTOMERID) 
    REFERENCES CUSTOMERS(CUSTOMERID),
    CONSTRAINT ORDERS_EMPLOYEEID_FK FOREIGN KEY (EMPLOYEEID) 
    REFERENCES EMPLOYEES(EMPLOYEEID)
);


CREATE TABLE PRODUCTS
(
    PRODUCTID NUMBER(8,0),
    PRODUCTNAME VARCHAR2(4) NOT NULL,
    SUPPLIERID NUMBER(8,0),
    CATEGORYID NUMBER(8,0),
    QUANTITYPERUNIT VARCHAR2(20),
    UNITPRICE NUMBER(8,2),
    UNITSINSTOCK NUMBER(6,0),
    UNITSONORDER NUMBER(6,0),
    REORDERLEVEL NUMBER(6,0),
    DISCONTINUED NUMBER(1,0) NOT NULL,
    CONSTRAINT PRODUCTS_CATEGORYID_FK FOREIGN KEY (CATEGORYID)
    REFERENCES CATEGORIES(CATEGORYID),
    CONSTRAINT PRODUCTS_SUPPLIERID_FK FOREIGN KEY (SUPPLIERID)
    REFERENCES SUPPLIERS(SUPPLIERID)

);

CREATE TABLE SUPPLIERS
(
    SUPPLIERID NUMBER(8,0),
    COMPANYNAME VARCHAR2(40) NOT NULL,
    CONTACTNAME VARCHAR2(30),
    CONTACTTITLE VARCHAR2(30),
    ADDRESS VARCHAR2(60),
    CITY VARCHAR2(15),
    REGION VARCHAR2(15),
    POSTALCODE VARCHAR2(10),
    COUNTRY VARCHAR2(15),
    PHONE VARCHAR2(24),
    FAX VARCHAR2(24),
    HOMEPAGE VARCHAR(200),
    CONSTRAINT SUPPLIERS_SUPPLIERID_PK PRIMARY KEY(SUPPLIERID)

);


CREATE TABLE SHIPPERS
(
    SHIPPERID NUMBER(8,0),
    COMPANYNAME VARCHAR2(40) NOT NULL,
    PHONE VARCHAR2(24),
    CONSTRAINT SHIPPERS_SHIPPERID_PK PRIMARY KEY(SHIPPERID)


);

【问题讨论】:

  • 在 PRODUCTS 表之前创建 SUPPLIERS 表。让我们看看会发生什么。不同表中的相同列名不会导致任何问题。

标签: sql oracle foreign-keys primary-key


【解决方案1】:

您的代码中存在三个问题:

  1. 如果您使用 oracle12c 或更高版本,则允许使用 128 个字符长的对象名称。如果您使用的是 oracle 11g 或更低版本,则只允许使用 30 个字符。 您应该考虑更改约束的名称:ORDERDETAILS_ORDERID_PRODUCTID_PK,使其少于 30 个字符。

  2. 您已将日期数据类型用作 DATE(7),但在 oracle 中 date 数据类型没有任何长度参数。所以使用没有数据长度的DATE,即(7)

  3. PRODUCTS 表之前创建SUPPLIERS 表,因为PRODUCTS 表指的是SUPPLIERS 表。

db<>fiddle演示

干杯!!

【讨论】:

    【解决方案2】:

    J

    在下面执行: 它修复了供应商和产品之间的日期数据类型和订单,最后是约束 ORDERDETAILS_ORDERID_PRODUCTID_PK 的长度

        CREATE TABLE CATEGORIES 
    (
    
        CATEGORYID NUMBER(8,0),
        CATEGORYNAME VARCHAR2(15) NOT NULL,
        CATEGORYCODE NUMBER(6,0),
        DESCRIPTION VARCHAR2(300),
        CONSTRAINT CATEGORIES_CATEGORYID_PK PRIMARY KEY (CATEGORYID)
    );
    
    
    CREATE TABLE CUSTOMERS 
    (
        CUSTOMERID CHAR(5),
        COMPANYNAME VARCHAR2(40) NOT NULL,
        CONTACTNAME VARCHAR2(30),
        CONTACTTITLE VARCHAR2(30),
        ADDRESS VARCHAR2(30),
        CITY VARCHAR2(15),
        REGION VARCHAR2(15),
        POSTALCODE VARCHAR2(10),
        COUNTRY VARCHAR2(15),
        PHONE VARCHAR2(24),
        FAX VARCHAR2(24),
        EMAIL VARCHAR2(50),
        CONSTRAINT CUSTOMERS_CUSTOMERID_PK PRIMARY KEY(CUSTOMERID) 
    );
    
    
    CREATE TABLE EMPLOYEES
    (
        EMPLOYEEID NUMBER(8,0),
        LASTNAME VARCHAR2(20) NOT NULL,
        FIRSTNAME VARCHAR2(10) NOT NULL,
        TITLE VARCHAR2(30),
        TITLEOFCOURTESY VARCHAR2(25),
        BIRTHDATE DATE,
        HIREDATE DATE,
        ADDRESS VARCHAR2(60),
        CITY VARCHAR2(15),
        REGION VARCHAR2(15),
        POSTALCODE VARCHAR2(10),
        COUNTRY VARCHAR2(15),
        HOMEPHONE VARCHAR2(24),
        EXTENSION VARCHAR2(4),
        NOTES VARCHAR2(600),
        REPORTSTO NUMBER(8,0),
        SIN CHAR(9),
        CONSTRAINT EMLOYEES_EMPLOYEEID_PK PRIMARY KEY(EMPLOYEEID)
    
    
    );
    
    
    CREATE TABLE ORDERDETAILS
    (
        ORDERID NUMBER(8,0),
        PRODUCTID NUMBER(8,0),
        UNITPRICE NUMBER(8,2) NOT NULL,
        QUANTITY NUMBER(6,0) NOT NULL,
        DISCOUNT NUMBER(2,2) NOT NULL,
    CONSTRAINT ORDERDETLS_ORDRID_PRODID_PK PRIMARY KEY (ORDERID, PRODUCTID)
    
    );
    
    
    CREATE TABLE ORDERS
    (
        ORDERID NUMBER(8,0),
        CUSTOMERID CHAR(5),
        EMPLOYEEID NUMBER(22),
        TERRITORYID VARCHAR2(20),
        ORDERDATE DATE,
        REQUIREDATE DATE,
        SHIPPEDDATE DATE,
        SHIPVIA NUMBER(8,0),
        FREIGHT NUMBER(8,2),
        SHIPNAME VARCHAR2(40),
        SHIPADDRESS VARCHAR2(60),
        SHIPCITY VARCHAR2(15),
        SHIPREGION VARCHAR2(15),
        SHIPPOSTALCODE VARCHAR2(10),
        SHIPCOUNTRY VARCHAR2(15),
        CONSTRAINT ORDERS_ORDERID_PK PRIMARY KEY(ORDERID),
        CONSTRAINT ORDERS_CUSTOMERID_FK FOREIGN KEY (CUSTOMERID) 
        REFERENCES CUSTOMERS(CUSTOMERID),
        CONSTRAINT ORDERS_EMPLOYEEID_FK FOREIGN KEY (EMPLOYEEID) 
        REFERENCES EMPLOYEES(EMPLOYEEID)
    );
    
    
    CREATE TABLE SUPPLIERS
    (
        SUPPLIERID NUMBER(8,0),
        COMPANYNAME VARCHAR2(40) NOT NULL,
        CONTACTNAME VARCHAR2(30),
        CONTACTTITLE VARCHAR2(30),
        ADDRESS VARCHAR2(60),
        CITY VARCHAR2(15),
        REGION VARCHAR2(15),
        POSTALCODE VARCHAR2(10),
        COUNTRY VARCHAR2(15),
        PHONE VARCHAR2(24),
        FAX VARCHAR2(24),
        HOMEPAGE VARCHAR(200),
        CONSTRAINT SUPPLIERS_SUPPLIERID_PK PRIMARY KEY(SUPPLIERID)
    
    );
    
    
    CREATE TABLE PRODUCTS
    (
        PRODUCTID NUMBER(8,0),
        PRODUCTNAME VARCHAR2(4) NOT NULL,
        SUPPLIERID NUMBER(8,0),
        CATEGORYID NUMBER(8,0),
        QUANTITYPERUNIT VARCHAR2(20),
        UNITPRICE NUMBER(8,2),
        UNITSINSTOCK NUMBER(6,0),
        UNITSONORDER NUMBER(6,0),
        REORDERLEVEL NUMBER(6,0),
        DISCONTINUED NUMBER(1,0) NOT NULL,
        CONSTRAINT PRODUCTS_CATEGORYID_FK FOREIGN KEY (CATEGORYID)
        REFERENCES CATEGORIES(CATEGORYID),
        CONSTRAINT PRODUCTS_SUPPLIERID_FK FOREIGN KEY (SUPPLIERID)
        REFERENCES SUPPLIERS(SUPPLIERID)
    
    );
    
    
    CREATE TABLE SHIPPERS
    (
        SHIPPERID NUMBER(8,0),
        COMPANYNAME VARCHAR2(40) NOT NULL,
        PHONE VARCHAR2(24),
        CONSTRAINT SHIPPERS_SHIPPERID_PK PRIMARY KEY(SHIPPERID)
    
    
    );
    

    【讨论】:

    • 错误列表是:日期数据类型,供应商和产品之间的订单,最后是约束ORDERDETAILS_ORDERID_PRODUCTID_PK的长度
    • 如果它解决了您的问题,请接受答案
    猜你喜欢
    • 2020-03-27
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    相关资源
    最近更新 更多