2011-01-28 347 views
1

我是SQL新手,這部分應該只是創建幾個表,對嗎?如果您使用的是Oracle XE和瀏覽器界面,你不能運行多行語句我看不出什麼錯,但甲骨文表示「缺失或無效選項」上線「CREATE TABLE專輯」sql在創建表語句時缺失或無效選項

CREATE TABLE Profile 
(prid INTEGER, 
first_name CHAR(20), 
last_name CHAR(20), 
year_of_birth INTEGER, 
month_of_birth CHAR(9), 
day_of_birth INTEGER, 
gender CHAR(6), 
PRIMARY KEY (prid)) 

CREATE TABLE Album 
(aid INTEGER, 
visible CHAR(20), 
link CHAR(30), 
create_time CHAR(30), 
mod_time CHAR(30), 
name CHAR(30), 
owner_prid INTEGER, 
PRIMARY KEY (aid), 
FOREIGN KEY owner_prid REFERENCES Profile(prid)) 
+0

在oracle只是「運行」 – 2011-01-28 01:08:21

回答

5

cyberkiwi的一部分已經回答你關於語法錯誤問題字段括號。

但是,由於您不熟悉SQL,因此我想對DDL本身發表評論。特別是,它看起來像是對許多這樣的列使用了錯誤的數據類型 - 這會回來咬你。

  • ,除非你有一個非常令人信服這樣做的原因

許多Oracle用戶會更進一步,建議你從來沒有使用CHAR數據類型,請不要使用CHAR數據類型。使用CHAR的基本問題是數據填充空白。因此,如果在GENDER列中存儲單詞「Male」,並且GENDER是CHAR(6),Oracle必須在該字符串的末尾存儲另外兩個空格。這使未來的比較操作非常危險 - 您必須確保使用CHAR比較語義而不是VARCHAR比較語義,並且這往往會變得很難看。此外,您正在浪費磁盤和內存中的空間來存儲這兩個額外的空間,因此沒有任何好處。您所有的CHAR的列確實應該VARCHAR2

  • 存儲日期爲dates--不存儲日期組件,並且不存儲日期爲字符串

而不是存儲YEAR_OF_BIRTHMONTH_OF_BIRTHDAY_OF_BIRTH,你幾乎可以肯定會有一個單獨的BIRTH_DATE列的DATE類型的存儲出生日期的列。如果你想知道某人出生的年份,你總是可以提取各種日期組件。儘管如此,將數據存儲爲DATE將確保日期組件本身是有效的(即,在月份被列爲「2月」時不存在任何錯別字,沒有數據質量問題,其中月份有時是「2月」,有時是「2月」有時候是'2',沒有2月30日的日期等等。)將數據存儲爲DATE使得優化器可以使用更多的信息,因此它更有可能生成最有效的計劃,因爲它知道關於數據分佈的一些信息。而且您可以使用Oracle提供的所有各種日期函數。同樣,由於CREATE_TIMEMOD_TIME是日期(Oracle DATE總是有一天和一個時間組件),因此您應該將它們存儲爲DATE(或TIMESTAMP)而不是VARCHAR2的日期和時間組件。這允許您使用日期(或時間戳)函數,它確保時間有效,消除了存儲在同一列中的不同格式的問題,並且使得使用各種日期函數變得更加容易。

4

。將它們拆分爲兩個語句並運行一個,然後清除文本,粘貼另一個,然後再次運行。

你的第二塊應該是

CREATE TABLE Album 
(aid INTEGER, 
visible CHAR(20), 
link CHAR(30), 
create_time CHAR(30), 
mod_time CHAR(30), 
name CHAR(30), 
owner_prid INTEGER, 
PRIMARY KEY (aid), 
FOREIGN KEY (owner_prid) REFERENCES Profile(prid)) 

即圍繞形成FK

+0

即使使用括號,ora-00902:XE上的無效數據類型 – 2011-01-28 01:22:10

+0

沒有。不會發生在我身上。 `創建了表格.`沒有「CONSTRAINT」關鍵字 – RichardTheKiwi 2011-01-28 01:27:27