【问题标题】:How do I fix a ORA-00902: invalid datatype creating a table如何修复 ORA-00902:创建表的数据类型无效
【发布时间】:2019-05-04 14:48:18
【问题描述】:

我正在将命令 SQL 部分中的表创建到已经填充的脚本中 我已经创建了几个表,但是在这个表中我收到一条消息

ORA-00902: 无效的数据类型

CREATE TABLE Weapons 
(
    id NUMBER(4),
    name VARCHAR2(30),
    damage NUMBER(4),
    company_id VARCHAR2 (10),

    CONSTRAINT pk_Weapons PRIMARY_KEY(id),
    CONSTRAINT fk_Weapons_company 
        FOREIGN_KEY(company_id) REFERENCES Company(id),
    CONSTRAINT fk_Weapons_ammo 
        FOREIGN_KEY(ammo_id) REFERENCES Ammo(id)
);

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    CONSTRAINT 中,应该是FOREIGN KEY 而不是FOREIGN_KEY。它也应该是PRIMARY KEY,而不是PRIMARY_KEY

    根据语法不需要下划线。所以查询将是:

    CREATE TABLE Weapons (
        id NUMBER(4),
        name VARCHAR2(30),
        damage NUMBER(4),
        company_id VARCHAR2(10),
     CONSTRAINT pk_Weapons PRIMARY KEY(id),
     CONSTRAINT fk_Weapons_company FOREIGN KEY(company_id) REFERENCES Company(id),
     CONSTRAINT fk_Weapons_ammo FOREIGN KEY(ammo_id) REFERENCES Ammo(id)
        );
    

    关于外键:https://www.techonthenet.com/oracle/foreign_keys/foreign_keys.php
    关于主键:https://www.techonthenet.com/oracle/primary_keys.php

    【讨论】:

    • CREATE TABLE Weapons ( id NUMBER(4), name VARCHAR2(30), damage NUMBER(4), company_id VARCHAR2(10), ammo_id VARCHAR2(10), CONSTRAINT pk_Weapons PRIMARY KEY(id), CONSTRAINT fk_Weapons_company FOREIGN KEY(company_id) REFERENCES Company(id), CONSTRAINT fk_Weapons_ammo FOREIGN KEY(ammo_id) REFERENCES ammo(id) );我现在更改了代码,但出现了一个新错误,谢谢您的回答,这非常有帮助,而且您提供的链接现在出现的错误是 ORA-02267:列类型与引用的列类型不兼容
    • 这可能是由于Weapons 数据类型中的company_idCompany(id) 中的ammo_id 数据类型不同或Weapons 数据类型中的ammo_idAmmo(id) 不同。请匹配两个列的数据类型
    • Company Table 中使用的包含公司 id 的 Create 命令是以下 CREATE TABLE Company ( id VARCHAR(3), name CHAR(30), CONSTRAINT pk_Company PRIMARY KEY(id) );这可能是由于公司 id 内的存储能力的长度造成的吗?
    • @Juan 是的,由于列的长度,会发生错误。所以如果company_id VARCHAR2(10)Weapons 表中,那么在Company 表中id 应该是VARCHAR2(10) 而已
    【解决方案2】:

    这是一个工作示例。我创建了AMMO 表(您没有发布其描述,所以我只使用了ID 列,这样外键约束就不会失败)。注意我在代码中写的cmets。

    SQL> create table ammo
      2    ( id  VARCHAR2(10),
      3      CONSTRAINT pk_ammo PRIMARY KEY(id) );
    
    Table created.
    
    SQL> CREATE TABLE Company
      2    ( id   VARCHAR(3),
      3      name VARCHAR(30),                   --> switch from CHAR to VARCHAR2
      4      CONSTRAINT pk_Company PRIMARY KEY(id) );
    
    Table created.
    
    SQL> CREATE TABLE Weapons
      2    ( id         NUMBER(4),
      3      name       VARCHAR2(30),
      4      damage     NUMBER(4),
      5      company_id VARCHAR2(3),             --> should match COMPANY.ID datatype
      6      ammo_id    VARCHAR2(10),            --> should match AMMO.ID datatype
      7      CONSTRAINT pk_Weapons PRIMARY KEY(id),
      8      CONSTRAINT fk_Weapons_company FOREIGN KEY(company_id) REFERENCES Company(id),
      9      CONSTRAINT fk_Weapons_ammo FOREIGN KEY(ammo_id) REFERENCES ammo(id) );
    
    Table created.
    
    SQL>
    

    在参照完整性约束中,您应该匹配外键列和主键列的数据类型。在明细表中有一个VARCHAR2(10) 指向主表中的VARCHAR2(3) 列是没有意义的;无论如何,您都不能将超过 3 个字符的内容放入详细信息表的列中(外键约束不允许您这样做)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-26
      • 2015-04-27
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2016-07-31
      相关资源
      最近更新 更多