这是我的作业代码
CREATE TABLE workorders
(
wo# NUMBER(5) PRIMARY KEY,
proj# VARCHAR(10) NOT NULL FOREIGN KEY REFERENCES project(proj#),
wo_desc VARCHAR(30) NOT NULL UNIQUE,
wo_assigned VARCHAR(30),
wo_hours NUMBER(5) NOT NULL CHECK(wo_hours>0),
wo_start DATE,
wo_due DATE,
wo_complete CHAR(1),
CONSTRAINT workorders_wo_complete_chk CHECK(wo_complete in('Y','N'))
);
我不明白为什么oracle apex不让我创建这个表,它说
ORA-00907:右括号缺失
但是我反复检查了很多次,我想我确实有所有的括号?我在这里做错了什么?
Thanks in advance
我只是想在这些约束下创建这个表,但是我可以找到我所知道的任何错误。
Oracle的错误消息通常不是特别有用,最好的方法是逐行检查代码,注释掉每一行,直到您隔离问题。
在这种情况下,违规行是
proj# VARCHAR(10) NOT NULL FOREIGN KEY REFERENCES project(proj#),
,问题是您不使用单词FOREIGN KEY
来定义外键—您只需要指定它引用的内容。所以这应该是
proj# VARCHAR(10) NOT NULL REFERENCES project(proj#),
然后你就没事了。
db<此处小提琴>此处小提琴>
在定义内联约束时,不使用FOREIGN KEY
术语:
proj# VARCHAR2(10) NOT NULL
REFERENCES project(proj#)
注意:Oracle使用VARCHAR2
和VARCHAR
是VARCHAR2
的别名,最好始终使用VARCHAR2
。
但是,当您定义行外键时需要这些关键字(但是这样您就会丢失逗号和列标识符):
proj# NOT NULL,
FOREIGN KEY (proj#) REFERENCES project (proj#)
注意:如果使用外键约束,则不需要定义数据类型,Oracle将隐式使用所引用的列的数据类型
使用(命名)内联约束的完整代码如下:
CREATE TABLE workorders
(
wo# NUMBER(5)
CONSTRAINT workorders__wo#__pk PRIMARY KEY,
proj# -- Note: do not need the data type as the FK will define it.
NOT NULL
CONSTRAINT workorders__proj#__fk REFERENCES project(proj#),
wo_desc VARCHAR2(30)
NOT NULL
CONSTRAINT workorders__wo_desc__u UNIQUE,
wo_assigned VARCHAR2(30),
wo_hours NUMBER(5)
NOT NULL
CONSTRAINT workorders__wo_hours__chk CHECK(wo_hours>0),
wo_start DATE,
wo_due DATE,
wo_complete CHAR(1)
CONSTRAINT workorders_wo_complete_chk CHECK(wo_complete in('Y','N'))
);
和使用(命名的)行外约束:
CREATE TABLE workorders
(
wo# NUMBER(5),
proj# -- Note: do not need the data type as the FK will define it.
NOT NULL,
wo_desc VARCHAR2(30)
NOT NULL,
wo_assigned VARCHAR2(30),
wo_hours NUMBER(5)
NOT NULL,
wo_start DATE,
wo_due DATE,
wo_complete CHAR(1),
CONSTRAINT workorders__wo#__pk PRIMARY KEY(wo#),
CONSTRAINT workorders__proj#__fk FOREIGN KEY (proj#) REFERENCES project(proj#),
CONSTRAINT workorders__wo_desc__u UNIQUE(wo_desc),
CONSTRAINT workorders_wo_complete_chk CHECK(wo_complete in('Y','N')),
CONSTRAINT workorders__wo_hours__chk CHECK(wo_hours>0)
);
小提琴