Oracle 甲骨文一直在展示';ORA-00907:缺少右括号';我做错了什么?

Oracle 甲骨文一直在展示';ORA-00907:缺少右括号';我做错了什么?,oracle,oracle11g,Oracle,Oracle11g,我发现至少有两个问题,不能像那样声明外键约束,不能有一个名为DATE的列,因为它是一个保留字 CREATE TABLE transaction_order ( national_ID VARCHAR2 (20) FOREIGN KEY REFERENCES client (national_ID), account_no VARCHAR2 (25) FOREIGN KEY REFERENCES account (account_no), transaction_ID VARCHAR2 (20)

我发现至少有两个问题,不能像那样声明外键约束,不能有一个名为DATE的列,因为它是一个保留字

CREATE TABLE transaction_order
(
national_ID VARCHAR2 (20) FOREIGN KEY REFERENCES client (national_ID),
account_no VARCHAR2 (25) FOREIGN KEY REFERENCES account (account_no),
transaction_ID VARCHAR2 (20) FOREIGN KEY REFERENCES transaction (transaction_ID),
date DATE NOT NULL,
time NUMBER (10) NOT NULL,
place VARCHAR2 (20) NOT NULL,
new_balance VARCHAR2 (20) NOT NULL
);

请不要将日期更改为“DATE”来回避保留字问题-这将在以后的应用程序堆栈中导致问题,尤其是当人们试图查询数据时

您的语法错误,正确的是:

CREATE TABLE TRANSACTION_ORDER (
       NATIONAL_ID      VARCHAR2(20),
       CONSTRAINT ID_XFK FOREIGN KEY ( NATIONAL_ID )
              REFERENCES CLIENT ( NATIONAL_ID ),
       ACCOUNT_NO       VARCHAR2(25),
       CONSTRAINT NO_XFK FOREIGN KEY ( ACCOUNT_NO )
              REFERENCES ACCOUNT ( ACCOUNT_NO ),
       TRANSACTION_ID   VARCHAR2(20),
       CONSTRAINT TRAN_ID_XFK FOREIGN KEY ( TRANSACTION_ID )
              REFERENCES TRANSACTION ( TRANSACTION_ID ),
       DATES            DATE NOT NULL,
       TIME             NUMBER(10) NOT NULL,
       PLACE            VARCHAR2(20) NOT NULL,
       NEW_BALANCE      VARCHAR2(20) NOT NULL
);
不带
外键

ORA-00907:缺少右括号

此消息是Oracle的通用语法消息之一。它表示我们的SQL不会编译,因为该语句包含缺少的关键字或逗号,或者关键字不合适。在本例中,这是因为编译器不喜欢内联外键子句

内联外键声明要么冗长,包含约束和外键关键字以及引用,要么简洁,仅包含引用

事实上,如果你要用极简主义的符号,为什么不全力以赴呢?这条线

CREATE TABLE transaction_order
(
national VARCHAR2 (20)  REFERENCES client (national_ID),
account_no VARCHAR2 (25) REFERENCES account (account_no),
transaction_ID VARCHAR2 (20)  REFERENCES transaction (transaction_ID),
date DATE NOT NULL,
time NUMBER (10) NOT NULL,
place VARCHAR2 (20) NOT NULL,
new_balance VARCHAR2 (20) NOT NULL
);
…创建客户端表主键的外键,并自动符合引用列的数据类型

所以你只需要这个

national_ID  REFERENCES client
注意,我更改了
transaction\u date
的名称:plain date是Oracle保留的关键字,因此不允许将其用作标识符

可能需要强制使用外键:外键本身无法做到这一点。也可能需要添加主键约束

CREATE TABLE transaction_order
(
national_ID  REFERENCES client ,
account_no   REFERENCES account ,
transaction_ID REFERENCES transaction,
transaction_date DATE NOT NULL,
time NUMBER (10) NOT NULL,
place VARCHAR2 (20) NOT NULL,
new_balance VARCHAR2 (20) NOT NULL
);