在oracle 11g中创建表时出错

时间:2014-12-31 02:35:17

标签: sql oracle create-table

CREATE TABLE Prescription (
    pre_id NUMBER(10),
    pssn CHAR(11),
    phy_ssn CHAR(11),
    date CHAR(11),
    quantity INTEGER,
    trade name CHAR(20),
    pharm id CHAR(11), 
    drop_off_time CHAR(10), 
    pick_up_time CHAR(10), 
    status CHAR (15),
    PRIMARY KEY(pre_id),
    FOREIGN KEY (pssn) REFERENCES Pri_Phy_Patient,
    FOREIGN KEY (phy_ssn) REFERENCES Doctor,
    FOREIGN KEY (trade_name, pharm_id) REFERENCES Make_Drug); 

使用上面的sql语句时出现ORA-00904:invalid identifier错误。

与上述相关的其他sql语句是:

CREATE TABLE Doctor (
    phy_ssn CHAR(11),
    name CHAR(20), 
    speciality CHAR(30),
    exp_years CHAR(10),
    PRIMARY KEY (phy_ssn));

CREATE TABLE Pri_Phy_Patient (
    pssn CHAR(11),
    name CHAR(20),
    age INTEGER,
    address CHAR(20),
    phy ssn CHAR(11),
    PRIMARY KEY (pssn),
    FOREIGN KEY (phy_ssn) REFERENCES Doctor );

CREATE TABLE Make_Drug (
    trade_name CHAR(20),
    pharm_id CHAR(11),
    formula VARCHAR(100)
    PRIMARY KEY (trade_name, pharm_id),
    FOREIGN KEY (pharm_id) REFERENCES Pharm_co);

有人可以建议我能做些什么吗?!!

4 个答案:

答案 0 :(得分:1)

如果您在SQL*Plus中执行该语句,则可以轻松找到错误并进行修复。

SQL> CREATE TABLE Prescription (
  2      pre_id NUMBER(10),
  3      pssn CHAR(11),
  4      phy_ssn CHAR(11),
  5      date CHAR(11),
  6      quantity INTEGER,
  7      trade name CHAR(20),
  8      pharm id CHAR(11),
  9      drop_off_time CHAR(10),
 10      pick_up_time CHAR(10),
 11      status CHAR (15),
 12      PRIMARY KEY(pre_id),
 13      FOREIGN KEY (pssn) REFERENCES Pri_Phy_Patient,
 14      FOREIGN KEY (phy_ssn) REFERENCES Doctor,
 15      FOREIGN KEY (trade_name, pharm_id) REFERENCES Make_Drug);
    date CHAR(11),
    *
ERROR at line 5:
ORA-00904: : invalid identifier
  1. 您不能直接使用DATE作为列名。请将其保留在"" double-quotation marks或更好地避免使用keyword
  2. create table脚本的更多问题 -

    1. 列名不能包含两个单词,trade name是无效的列名。将其更改为trade_name
    2. 同样,将pharm id更改为pharm_id
    3. 为什么使用CHAR数据类型?它将始终在右侧填充空白并占用空间。更好地使用VARCHAR2数据类型。

答案 1 :(得分:0)

此脚本有效:

CREATE TABLE Doctor (
    phy_ssn CHAR(11) not null,
    name CHAR(20), 
    speciality CHAR(30),
    exp_years CHAR(10),
    constraint pk_phy_ssn PRIMARY KEY (phy_ssn));

CREATE TABLE Pri_Phy_Patient (
    pssn CHAR(11) not null,
    name CHAR(20),
    age INTEGER,
    address CHAR(20),
    phy_ssn CHAR(11),
    constraint pk_pssn PRIMARY KEY (pssn),
    constraint fk_ppp_phy_ssn FOREIGN KEY (phy_ssn) REFERENCES Doctor(phy_ssn) );

CREATE TABLE Make_Drug (
    trade_name CHAR(20) not null,
    pharm_id CHAR(11) not null,
    formula VARCHAR(100),
    constraint pk_trname_phid PRIMARY KEY (trade_name, pharm_id));

CREATE TABLE Prescription (
    pre_id NUMBER(10) not null,
    pssn CHAR(11),
    phy_ssn CHAR(11),
    date_time CHAR(11),
    quantity INTEGER,
    trade_name CHAR(20),
    pharm_id CHAR(11), 
    drop_off_time CHAR(10), 
    pick_up_time CHAR(10), 
    status CHAR(15),
    constraint pk_pre_id PRIMARY KEY(pre_id),
    constraint fk_pre_pssn FOREIGN KEY (pssn) REFERENCES Pri_Phy_Patient(pssn),
    constraint fk_pre_phy_ssn FOREIGN KEY (phy_ssn) REFERENCES Doctor(phy_ssn),
    constraint fk_pre_tr_nm_ph_id FOREIGN KEY (trade_name, pharm_id) REFERENCES Make_Drug(trade_name, pharm_id));

<强>更新

问题主要是由于列名称中间的空格,缺少逗号而引发了无效的标识符,因为您尝试使用date作为列名,Oracle并不喜欢它。 / p>

您可以使用此Demo

答案 2 :(得分:0)

将DATE列名更改为任何其他名称,因为您不能将DATE用作列名或表名。您可以从以下链接http://www.petefreitag.com/tools/sql_reserved_words_checker/

获取有关Oracle保留字的更多详细信息

答案 3 :(得分:-2)

日期CHAR(11) 日期是SQL中的保留字。它不能像你那样被声明为列。 请更改列名称,它将起作用。