sql缺失或create table语句上的无效选项

时间:2011-01-28 01:05:10

标签: sql oracle

我是SQL的新手,这个片段应该只做几张桌子吧?我看不出有什么不对,但Oracle在“CREATE TABLE Album”

行上说“丢失或无效选项”
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))

2 个答案:

答案 0 :(得分:5)

cyberkiwi已经回答了有关语法错误的问题。

但是,由于您是SQL新手,我想对DDL本身发表评论。特别是,对于许多这些列,您似乎使用了错误的数据类型 - 这些将会回来咬你。

  • 除非您有极其令人信服的理由,否则请勿使用CHAR数据类型

许多Oracle用户会更进一步,建议您永远不要使用CHAR数据类型。使用CHAR的基本问题是数据是空白填充的。因此,如果您在GENDER列中存储单词“Male”并且GENDER是CHAR(6),则Oracle必须在字符串的末尾存储两个额外的空格。这使得未来的比较操作非常危险 - 你必须确保使用CHAR比较语义而不是VARCHAR比较语义,这往往会变得丑陋。此外,您在磁盘和内存中浪费空间来存储这两个额外的空间,没有任何好处。所有CHAR列都应该是VARCHAR2

  • 将日期存储为日期 - 不存储日期组件,也不将日期存储为字符串

而不是存储YEAR_OF_BIRTHMONTH_OF_BIRTHDAY_OF_BIRTH,您几乎肯定会更好地使用DATE类型的BIRTH_DATE列,您可以在其中存储日期。如果您想知道某人出生的年份,您可以随时提取各种日期组件。但是,将数据存储为DATE将确保日期组件本身有效(即没有将月份列为“二月”的拼写错误,没有数据质量问题,其中月份有时为“2月”,有时为“2月”,有时候“2”,2月30日没有日期等。)将数据存储为DATE可以为优化器提供更多信息,因此它更有可能生成最有效的计划,因为它知道有关数据分布的信息。您可以使用Oracle提供的所有各种日期函数。

出于同样的原因,由于CREATE_TIMEMOD_TIME是日期(Oracle DATE总是有一天和一个时间组件),您应该将它们存储为DATE(或TIMESTAMP)而不是VARCHAR2的。这允许您使用日期(或时间戳)函数,它确保时间有效,它消除了存储在同一列中的不同格式的问题,并且使得使用各种日期函数更加容易。

答案 1 :(得分:4)

如果您使用的是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

一部分的字段周围的括号