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的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL: Cannot delete or update a parent row: a foreign key constraint fails
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