我是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))
答案 0 :(得分:5)
cyberkiwi已经回答了有关语法错误的问题。
但是,由于您是SQL新手,我想对DDL本身发表评论。特别是,对于许多这些列,您似乎使用了错误的数据类型 - 这些将会回来咬你。
许多Oracle用户会更进一步,建议您永远不要使用CHAR数据类型。使用CHAR的基本问题是数据是空白填充的。因此,如果您在GENDER
列中存储单词“Male”并且GENDER
是CHAR(6),则Oracle必须在字符串的末尾存储两个额外的空格。这使得未来的比较操作非常危险 - 你必须确保使用CHAR比较语义而不是VARCHAR比较语义,这往往会变得丑陋。此外,您在磁盘和内存中浪费空间来存储这两个额外的空间,没有任何好处。所有CHAR列都应该是VARCHAR2
而不是存储YEAR_OF_BIRTH
,MONTH_OF_BIRTH
和DAY_OF_BIRTH
,您几乎肯定会更好地使用DATE类型的BIRTH_DATE
列,您可以在其中存储日期。如果您想知道某人出生的年份,您可以随时提取各种日期组件。但是,将数据存储为DATE将确保日期组件本身有效(即没有将月份列为“二月”的拼写错误,没有数据质量问题,其中月份有时为“2月”,有时为“2月”,有时候“2”,2月30日没有日期等。)将数据存储为DATE可以为优化器提供更多信息,因此它更有可能生成最有效的计划,因为它知道有关数据分布的信息。您可以使用Oracle提供的所有各种日期函数。
出于同样的原因,由于CREATE_TIME
和MOD_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
一部分的字段周围的括号