簡體   English   中英

創建表語句上的sql丟失或選項無效

[英]sql missing or invalid option on create table statement

我是SQL的新手,該部分應該只創建幾個表,對嗎? 我看不到任何錯誤,但是Oracle在“ CREATE TABLE Album”行上說了“ missing or invalid option”

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

cyberkiwi已經回答了您有關語法錯誤的問題。

但是,由於您不熟悉SQL,所以我想對DDL本身進行評論。 特別是,您似乎為許多此類列使用了錯誤的數據類型,這會再次咬住您。

  • 除非您有非常有說服力的理由,否則不要使用CHAR數據類型。

許多Oracle用戶會走得更遠,建議您不要使用CHAR數據類型。 使用CHAR的基本問題是數據空白填充。 因此,如果將單詞“ Male”存儲在GENDER列中,並且GENDER是CHAR(6),則Oracle必須在字符串的末尾存儲兩個額外的空格。 這使得將來的比較操作非常危險-您必須確保使用CHAR比較語義而不是VARCHAR比較語義,並且這種做法會變得很丑陋。 此外,您浪費磁盤和內存上的空間來存儲這兩個額外的空間毫無益處。 您所有的CHAR列均應為VARCHAR2

  • 將日期存儲為日期-不存儲日期成分也不將日期存儲為字符串

與其YEAR_OF_BIRTHMONTH_OF_BIRTHDAY_OF_BIRTH存儲, MONTH_OF_BIRTH使用一個DATE類型的BIRTH_DATE列來存儲出生日期,這無疑是更好的選擇。 如果您想了解某人出生的年份,則始終可以提取各種日期成分。 不過,將數據存儲為DATE可以確保日期部分本身有效(例如,沒有錯別字,其中月份被列為“ Febuary”,沒有數據質量問題,月份有時為“ Feb”,有時為“ February”,有時是'2',沒有2月30日的日期,等等。)將數據存儲為DATE可以使優化程序獲得更多的信息,因此更有可能生成最有效的計划,因為它對數據分布有所了解。 您可以使用Oracle提供的所有各種日期函數。

同樣,由於CREATE_TIMEMOD_TIME是日期(Oracle DATE始終具有日期和時間成分),因此應將它們存儲為DATE(或TIMESTAMP),而不是VARCHAR2。 這使您可以使用日期(或時間戳記)函數,確保時間有效,消除了將不同格式存儲在同一列中的問題,並且使使用各種日期函數更加容易。

如果使用的是Oracle XE和瀏覽器界面,則不能運行多行語句。 將它們拆分為兩個語句並運行一個,然后清除文本,粘貼另一個,然后再次運行。

您的第二塊應該是

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一部分的領域的括號

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM