【问题标题】:DECLARE A FOREIGN KEY CONSTRAINT causes ORA-00907DECLARE A FOREIGN KEY CONSTRAINT 导致 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" ;

感谢您的帮助!

【问题讨论】:

    标签: oracle foreign-keys ddl create-table


    【解决方案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,谢谢。不管是什么,都是 :)
        猜你喜欢
        • 2018-10-11
        • 1970-01-01
        • 2014-01-02
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-11
        • 1970-01-01
        相关资源
        最近更新 更多