【问题标题】:SQL Error: ORA-00911: Invalid CharacterSQL 错误:ORA-00911:无效字符
【发布时间】:2014-05-17 09:41:06
【问题描述】:

我是 Oracle 的新手,我正在尝试创建一个表,但我不断收到无效字符警告。我已经尝试删除它并重新输入它并检查了任何无效字符,但我似乎找不到任何字符。 我的表创建代码是:

CREATE TABLE DEPARTMENT (
DNUMBER CHAR(1) PRIMARY KEY, 
DNAME VARCHAR2(20), 
MGRSSN CHAR(11), 
MGRSTARTDATE CHAR(10), 
CONSTRAINT DEPARTMENT_FK FOREIGN KEY (MGRSSN) REFERENCES EMPLOYEE(SSN));

CREATE TABLE EMPLOYEE (
SSN CHAR(11) PRIMARY KEY, 
FNAME VARCHAR2(20), 
MINIT CHAR(1), 
LNAME VARCHAR2(20), 
BIRTHDATE CHAR(10), 
ADDRESS VARCHAR2(30), 
SEX CHAR(1), 
SALARY INTEGER, 
SUPERSSN CHAR(11), 
DNO CHAR(1), 
CONSTRAINT EMPLOYEE_FK1 FOREIGN KEY (SUPERSSN) REFERENCES EMPLOYEE (SSN), 
CONSTRAINT EMPLOYEE_FK2 FOREIGN KEY (DNO) REFERENCES DEPARTMENT (DNUMBER));

【问题讨论】:

  • 你是如何运行这个 SQL 的?使用 SQL*Plus? SQL开发者? PL/SQL 开发人员?蟾蜍? JDBC?还有什么?
  • 我在小提琴中测试了你的陈述。我得到的只有表不存在异常。但这确实意味着您的语句已经成功解析。
  • 不相关:BIRTHDATEMGRSTARTDATE 应该是正确的 DATE 列,不要不要对日期使用 char 数据类型。永远不要在字符列中存储日期。
  • Oracle XE 的 HTML 界面不允许您运行多个语句。您应该改用适当的 SQL 客户端。
  • 您在创建之前引用了一个表,稍后添加约束sqlfiddle.com/#!4/f92cd

标签: sql oracle ora-00911


【解决方案1】:

我在 SQLplus 中也遇到过同样的问题。 我必须从之前工作的其他文件中复制一些创建表 sql 并更改它,更改后的 sql 可以正常工作。 在 Eclipse 中比较这两个文件后,只有空格有区别。文件字符格式似乎有问题。

【讨论】:

    【解决方案2】:

    据我所知,这里没有“坏字符”问题,因为我无法引发最初报告的错误。但是,这些表上的一些限制 - DEPARTMENT 上的 DEPARTMENT_FK 和 EMPLOYEE 上的 EMPLOYEE_FK1 - 正在导致问题。 DEPARTMENT_FK 约束尝试在创建 EMPLOYEE 表之前对其进行引用。第二种情况,自引用EMPLOYEE_FK1约束创建失败,因为执行CREATE TABLE for EMPLOYEE时EMPLOYEE表不存在。

    要解决这个问题,应该从表定义中删除这些约束。然后应该创建表,并离线添加约束:

    CREATE TABLE DEPARTMENT (
    DNUMBER CHAR(1) PRIMARY KEY, 
    DNAME VARCHAR2(20), 
    MGRSSN CHAR(11), 
    MGRSTARTDATE CHAR(10)
    --CONSTRAINT DEPARTMENT_FK FOREIGN KEY (MGRSSN) REFERENCES EMPLOYEE(SSN)
    );
    
    CREATE TABLE EMPLOYEE (
    SSN CHAR(11) PRIMARY KEY, 
    FNAME VARCHAR2(20), 
    MINIT CHAR(1), 
    LNAME VARCHAR2(20), 
    BIRTHDATE CHAR(10), 
    ADDRESS VARCHAR2(30), 
    SEX CHAR(1), 
    SALARY INTEGER, 
    SUPERSSN CHAR(11), 
    DNO CHAR(1), 
    --CONSTRAINT EMPLOYEE_FK1 FOREIGN KEY (SUPERSSN) REFERENCES EMPLOYEE (SSN), 
    CONSTRAINT EMPLOYEE_FK2 FOREIGN KEY (DNO) REFERENCES DEPARTMENT (DNUMBER));
    
    ALTER TABLE DEPARTMENT
      ADD CONSTRAINT DEPARTMENT_FK FOREIGN KEY (MGRSSN) REFERENCES EMPLOYEE(SSN);
    
    ALTER TABLE EMPLOYEE
      ADD CONSTRAINT EMPLOYEE_FK1 FOREIGN KEY (SUPERSSN) REFERENCES EMPLOYEE (SSN);
    

    通过这种方式创建的表将具有所需的约束。

    dbfiddle here

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      相关资源
      最近更新 更多