声明外键约束导致 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"
抱歉疏忽了!
我有一个 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"
抱歉疏忽了!