DECLARE FOREIGN KEY CONSTRAINT导致ORA-00907

时间:2018-03-26 12:11:21

标签: oracle foreign-keys ddl create-table

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

我得到:ORA-00907: - “缺少右括号”

  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" ;

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

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" ;

答案 1 :(得分:1)

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

CREATE TABLE "mySchema"."mySecondTable " 

而不是:

CREATE TABLE "mySchema"."mySecondTable" 

抱歉缺乏关注!

答案 2 :(得分:0)

一些反对意见,如果我可以:你没有写那段代码,是吗?它可疑地看起来像某个GUI的复制/粘贴 - 真实 - 从字典中获取所有信息并创建丛林,当你只需要一个丛林时。

不要将Oracle对象的名称括在双引号中 - 更糟糕的是 - 在这些双引号中使用混合大小写。否则,您将不得不使用双引号引用它们,相同的混合大小写始终。真正的噩梦。默认情况下,Oracle将使用大写创建它们,但您可以使用任何大小写引用它们(较低,混合,较高 - 只是不要存储它们!)。

  • NO:“mySecondTable” - 注意一个尾随空间 - 恐怖!
  • 是(因为他们的名字无论如何都将存储在大写中):
    • mysecondtable
    • MYSECONDTABLE
    • mySecondTable

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

所有存储mumbo-jumbo ... phew,如果这是我们日常用途的普通表,你真的不应该关心它并让Oracle处理这些信息。我同意 - 在指定所有如果你知道它们是什么时没问题。阅读你的问题,我认为你应该依赖Oracle。

缩短,您的查询可能/应该如下所示(我正在创建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>