2014-12-31 117 views
1
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); 

我得到ORA-00904:invalid identifier使用上述sql語句時出錯。在oracle 11g中創建表時出錯

與上述有關的一個其他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); 

任何人都可以在我能做些什麼關於這個建議!

+0

正如Doc123所說,「DATE」是一個保留字。我沒有發現那一個,但我也可以給你一個建議:即使你能夠使用'DATE'作爲列描述......對列值有什麼看法?列的名稱應該是有意義的。之後你的開發者會感謝你。另一列是「狀態」,也可能更具指示性。什麼樣的狀態?對列命名的長度存在限制,但不要在另一個方向上過分,使所有列只有6或8個字符,使用通用名稱。 – tvCa

回答

-2

date CHAR(11) 日期是SQL中的保留字。它不能像你所做的那樣被聲明爲一列。 請更改列名稱,它將起作用。

+0

這不是唯一的問題,還有其他問題,正如我在答覆中提到的那樣。 –

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)); 

UPDATE

的問題主要是由於在列名,失蹤逗號和無效的標識符的中間空間被提出,因爲你試圖用date作爲列名,Oracle不喜歡它。

你可以玩這個Demo

+0

我得到了同樣的錯誤 –

+0

你是否首先成功創建了其他表? – benji

+0

@RachelPhilomena請參閱我的更新 – benji

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

更多問題與create table腳本 -

  • 列名不能有兩個詞語,trade name是無效的列名。將其更改爲trade_name
  • 同樣,將pharm id更改爲pharm_id
  • 爲什麼使用CHAR數據類型?它將始終有空白填充到右側並佔用空間。更好地使用VARCHAR2數據類型。