繁体   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