DECLARE A FOREIGN KEY CONSTRAINT 导致 ORA-00907

Posted

技术标签:

【中文标题】DECLARE A FOREIGN KEY CONSTRAINT 导致 ORA-00907【英文标题】:DECLARE A FOREIGN KEY CONSTRAINT causes ORA-00907 【发布时间】:2018-03-26 12:11:21 【问题描述】:

我有一个 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" ;

感谢您的帮助!

【问题讨论】:

【参考方案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" ;

【讨论】:

【参考方案2】:

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

CREATE TABLE "mySchema"."mySecondTable " 

代替:

CREATE TABLE "mySchema"."mySecondTable" 

抱歉没有引起注意!

【讨论】:

【参考方案3】:

如果我可以的话,有一些反对意见:你没有编写那个代码,是吗?它看起来像是来自某个 GUI 的复制/粘贴 - 确实 - 从字典中获取所有信息并创建一个 jungle,而您只需要一个 bush。 p>

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

否:“mySecondTable” - 注意尾随空格 - 太可怕了! 是(因为他们的名字无论如何都会以大写形式存储): mysecondtable MYSECONDTABLE mySecondTable

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

所有这些存储的庞然大物......唷,如果这是我们日常使用的普通表,你真的不应该关心它,让 Oracle 处理这些信息。我同意 - 指定所有 if 你知道它们是什么没有问题。阅读您的问题,我认为您应该依赖 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>

【讨论】:

也可以是DBMS_METADATA.GET_DDL的输出 真的,@Rene,谢谢。不管是什么,都是 :)

以上是关于DECLARE A FOREIGN KEY CONSTRAINT 导致 ORA-00907的主要内容,如果未能解决你的问题,请参考以下文章

删除提示 FOREIGN KEY 约束引用”

PG Foreign key

MYSQL: Cannot delete or update a parent row: a foreign key constraint fails

MySQL Foreign Key

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

mysql ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constrain fails