我有一个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" ;
感谢您的帮助!
答案 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将使用大写创建它们,但您可以使用任何大小写引用它们(较低,混合,较高 - 只是不要存储它们!)。
不需要为产生主键约束的列指定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>