[英]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本身进行评论。 特别是,您似乎为许多此类列使用了错误的数据类型,这会再次咬住您。
许多Oracle用户会走得更远,建议您不要使用CHAR数据类型。 使用CHAR的基本问题是数据空白填充。 因此,如果将单词“ Male”存储在GENDER
列中,并且GENDER
是CHAR(6),则Oracle必须在字符串的末尾存储两个额外的空格。 这使得将来的比较操作非常危险-您必须确保使用CHAR比较语义而不是VARCHAR比较语义,并且这种做法会变得很丑陋。 此外,您浪费磁盘和内存上的空间来存储这两个额外的空间毫无益处。 您所有的CHAR列均应为VARCHAR2
与其YEAR_OF_BIRTH
, MONTH_OF_BIRTH
和DAY_OF_BIRTH
存储, MONTH_OF_BIRTH
使用一个DATE类型的BIRTH_DATE
列来存储出生日期,这无疑是更好的选择。 如果您想了解某人出生的年份,则始终可以提取各种日期成分。 不过,将数据存储为DATE可以确保日期部分本身有效(例如,没有错别字,其中月份被列为“ Febuary”,没有数据质量问题,月份有时为“ Feb”,有时为“ February”,有时是'2',没有2月30日的日期,等等。)将数据存储为DATE可以使优化程序获得更多的信息,因此更有可能生成最有效的计划,因为它对数据分布有所了解。 您可以使用Oracle提供的所有各种日期函数。
同样,由于CREATE_TIME
和MOD_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.