【问题标题】:ORA-02253: constraint specification not allowed here - foreign keyORA-02253: 此处不允许约束规范 - 外键
【发布时间】:2017-12-09 00:18:14
【问题描述】:

我是这个 sql 的新手,我想知道在这种情况下问题出在哪里。

"此处不允许约束规范" 原因:语句中不允许使用约束规范。

CREATE TABLE CLIENTE(
RUT VARCHAR2(10) CONSTRAINT CLIENTE_PK PRIMARY KEY,
NOMBRE VARCHAR2(20) CONSTRAINT NOMBRE_CLIENTE NOT NULL,
APELLIDOP VARCHAR2(30) CONSTRAINT APELLIDOP_CLIENTE NOT NULL,
APELLIDOM VARCHAR2(30) CONSTRAINT APPELIDOM_CLIENTE NOT NULL,
DIRECCION VARCHAR2(100) CONSTRAINT DIRECCION_CLIENTE NOT NULL,
TELEFONO NUMBER(8) CONSTRAINT TELEFONO_CLIENTE NOT NULL,
EMAIL VARCHAR2(255) CONSTRAINT EMAIL_CLIENTE NOT NULL,
FECHA_NACIMIENTO DATE CONSTRAINT FECHA_NACIMIENTO_CLIENTE NOT NULL,
SEXO CHAR(1) CONSTRAINT SEXO_CLIENTE NOT NULL,
COD_CIUDAD NUMBER(3) CONSTRAINT CLIENTE_CIUDAD_FK FOREIGN KEY (COD_CIUDAD) 
REFERENCES CIUDAD (COD_CIUDAD)
);

【问题讨论】:

  • 请提供更多信息,说明您要完成的工作或遇到的错误
  • 我需要创建一个表,但它告诉我约束是不允许的
  • @gile - 它是部分重复的。在您链接到的问题中,所需的约束显然是脱节的(缺少逗号是唯一可能的解决方案)。在这个线程的问题中,约束也可能是一个内联约束;修复与添加逗号不同。
  • @Derezed - 每当您发布错误消息时(就像您在此处所做的那样),发布全文 - 或者,在您对错误更加熟悉之后(我保证您会的!),只需找到它的位置显示代码中遇到错误的确切行和位置。这通常非常有用。这就是 Guglie 所要问的。

标签: sql oracle oracle11g constraints ddl


【解决方案1】:

在最后一行代码中,定义列 cod_ciudad 并添加外键约束。

有两类约束:IN-LINE 约束,定义在列名和数据类型之后(它们只能影响“that”列)和 OUT-OF-LINE 约束,位于表的底部,在所有列定义之后。涉及多于一列的约束只能是线外约束。

您在代码中定义的约束仅在一列上,此外,它在cod_ciudad 上。您没有在列定义(名称和数据类型)之间添加逗号;这是 IN-LINE 约束的正确语法。但 IN-LINE 外键约束不需要关键字 FOREIGN KEY,也不需要在括号中重复列名。约束为 IN-LINE,只能引用“当前”列。所以:修复代码的一种方法是从代码中删除FOREIGN KEY (COD_CIUDAD)

解决它的另一种方法是将约束变为 OUT-OF-LINE 约束。那么语法是正确的,但是必须在关键字CONSTRAINT前加一个逗号(,)。

【讨论】:

    【解决方案2】:

    试试这个:

    CREATE TABLE CLIENTE(
       RUT              VARCHAR2(10)  NOT NULL,
       NOMBRE           VARCHAR2(20)  NOT NULL,
       APELLIDOP        VARCHAR2(30)  NOT NULL,
       APELLIDOM        VARCHAR2(30)  NOT NULL,
       DIRECCION        VARCHAR2(100) NOT NULL,
       TELEFONO         NUMBER(8)     NOT NULL,
       EMAIL            VARCHAR2(255) NOT NULL,
       FECHA_NACIMIENTO DATE          NOT NULL,
       SEXO             CHAR(1)       NOT NULL,
       COD_CIUDAD       NUMBER(3) 
    );
    
    ALTER TABLE CLIENTE
      ADD CONSTRAINT CLIENTE_PK PRIMARY KEY (RUT)
      USING INDEX;
    
    ALTER TABLE CLIENTE
      ADD CONSTRAINT CLIENTE_CIUDAD_FK FOREIGN KEY (COD_CIUDAD)
      REFERENCES [FOREIGN KEY TABLE NAME] ([PRIMARY KEY COLUMN OF FOREIGN KEY TABLE]);
    

    【讨论】:

      【解决方案3】:

      您必须将约束与列声明分开

      只需使用以下命令

      CREATE TABLE CLIENTE(
      RUT VARCHAR2(10) CONSTRAINT CLIENTE_PK PRIMARY KEY,
      NOMBRE VARCHAR2(20) CONSTRAINT NOMBRE_CLIENTE NOT NULL,
      APELLIDOP VARCHAR2(30) CONSTRAINT APELLIDOP_CLIENTE NOT NULL,
      APELLIDOM VARCHAR2(30) CONSTRAINT APPELIDOM_CLIENTE NOT NULL,
      DIRECCION VARCHAR2(100) CONSTRAINT DIRECCION_CLIENTE NOT NULL,
      TELEFONO NUMBER(8) CONSTRAINT TELEFONO_CLIENTE NOT NULL,
      EMAIL VARCHAR2(255) CONSTRAINT EMAIL_CLIENTE NOT NULL,
      FECHA_NACIMIENTO DATE CONSTRAINT 
      FECHA_NACIMIENTO_CLIENTE NOT NULL,
      SEXO CHAR(1) CONSTRAINT SEXO_CLIENTE NOT NULL,
      COD_CIUDAD NUMBER(3),
      CONSTRAINT CLIENTE_CIUDAD_FK FOREIGN KEY (COD_CIUDAD) 
      REFERENCES CIUDAD (COD_CIUDAD)
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        • 2020-03-31
        • 1970-01-01
        • 2018-11-16
        相关资源
        最近更新 更多