声明外键约束导致 ORA-00907

DECLARE A FOREIGN KEY CONSTRAINT causes ORA-00907

我有一个 create table 语句,但它没有编译, fk_myFirstTable CONSTRAINT 导致问题。 有人知道 CONSTRAINT 有什么问题吗?

我得到:ORA-00907:-"missing right parenthesis"

  CREATE TABLE "mySchema"."mySecondTable " 
   (    
   idNumber NUMBER(10,0)  NOT NULL ENABLE, 
   SystemId  NUMBER(10,0) NOT NULL ENABLE, 
   CONSTRAINT "mySecondTable _PK" PRIMARY KEY (idNumber ),
   CONSTRAINT "fk_myFirstTable" FOREIGN KEY (SystemId) REFERENCES myFirstTable(SystemId) 
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MYTBS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MYTBS" ;

感谢帮助!

USING INDEX 子句是主键约束的一部分。我将外键约束移到了 ENABLE 之后。 试试这个:

 CREATE TABLE "mySchema"."mySecondTable " 
   (    
   idNumber NUMBER(10,0)  NOT NULL ENABLE, 
   SystemId  NUMBER(10,0) NOT NULL ENABLE, 
   CONSTRAINT "mySecondTable _PK" PRIMARY KEY (idNumber )
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MYTBS"  ENABLE,
 CONSTRAINT "fk_myFirstTable" FOREIGN KEY (SystemId) REFERENCES myFirstTable(SystemId)
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MYTBS" ;

一些反对意见,如果可以的话:你没有写那个代码,是吗?它可疑地看起来像来自某些 GUI 的 copy/paste,它 - 是的 - 从字典中获取所有信息并创建一个 jungle,而你只需要一个 bush .

不要将 Oracle 对象的名称括在双引号中——更糟糕的是——在这些双引号中使用混合大小写。否则,您必须使用双引号引用它们,相同的大小写混合,ALWAYS。一场真正的噩梦。默认情况下,Oracle 将使用大写字母创建它们,但您可以使用任何大小写来引用它们(小写、混合、大写 - 只是不要这样存储它们!)。

  • 否:"mySecondTable " - 注意尾随 space - 恐怖!
  • YES(因为他们的名字无论如何都会以大写形式存储):
    • mysecondtable
    • 我的二表
    • 我的第二张表

无需为构成主键约束的列指定 NOT NULL;默认情况下,它们不能为 NULL。

所有存储 mumbo-jumbo ... 呸,如果这是我们日常使用的普通 table,您真的不应该关心它并让 Oracle 处理这些信息。我同意 - 如果 如果 你知道它们是什么,那么指定所有这些都没有问题。看了你的问题,我觉得你应该依赖Oracle。

缩短了,您的查询 might/should 如下所示(我正在创建 my_first_table,只是为了使外键约束起作用):

SQL> create table my_first_table
  2    (system_id number constraint pk_mft primary key);

Table created.

SQL> create table my_second_table
  2    (id_number number constraint pk_mst primary key,
  3     system_id number constraint fk_my_first_table references my_first_table (system_id)
  4                      not null
  5    );

Table created.

SQL>

我在声明行中有一个愚蠢的space:

CREATE TABLE "mySchema"."mySecondTable " 

而不是:

CREATE TABLE "mySchema"."mySecondTable" 

抱歉疏忽了!