oracle ORA-00907:缺少右括号但我看不到它?

qaxu7uf2  于 2022-11-22  发布在  Oracle
关注(0)|答案(2)|浏览(259)

这是我的作业代码

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:缺少右括号
但是我反复检查了很多次,我想我确实有所有的括号?我在这里做错了什么?
先谢了
我只想在这些约束下创建此表,但我可以找到我所知道的任何错误。

koaltpgm

koaltpgm1#

Oracle 的 错误 消息 通常 不是 特别 有用 , 最 好 的 办法 是 逐 行 检查 代码 , 注解 掉 每 一 行 , 直到 找出 问题 所在 。
在 这种 情况 下 , 出错 的 行 是

proj# VARCHAR(10) NOT NULL FOREIGN KEY REFERENCES project(proj#),

中 的 每 一 个
问题 是 , 您 不 需要 使用 单词 FOREIGN KEY 来 定义 外键 - 您 只 需要 指定 它 引用 的 内容 。

proj# VARCHAR(10) NOT NULL REFERENCES project(proj#),

格式
然后 你 就 没事 了 。
db<>fiddle here 的 最 大 值

uxhixvfz

uxhixvfz2#

定义内嵌条件约束时,不使用FOREIGN KEY术语:

proj# VARCHAR2(10) NOT NULL
                   REFERENCES project(proj#)
  • 注意:Oracle使用VARCHAR2,而VARCHARVARCHAR2的别名,因此最佳做法是始终使用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)
);

fiddle

相关问题