插入查询给出ORA-01722:无效的数字错误

amo*_*ngh 4 sql oracle oracle11g

我使用以下查询创建了一个股票表

CREATE TABLE stock
  (
    product_id REFERENCES product ,
    product_name REFERENCES product ,
    color    VARCHAR2(20) ,
    memory   VARCHAR2(20) ,
    in_stock NUMBER(3)
  );
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下查询插入一行:

insert into stock values(8881,'Nexus 4','Black','2GB-16GB',3);
Run Code Online (Sandbox Code Playgroud)

它正在给ORA-01722:无效的数字错误,我知道为什么错误来了,但我无法弄清楚我做了什么错

产品表:

product_id ..number , product_name .. varchar2
Run Code Online (Sandbox Code Playgroud)

添加图片

在此输入图像描述

Jus*_*ave 5

product_id是主要的关键,product是一个number专栏.定义表时

CREATE TABLE stock
  (
    product_id REFERENCES product ,
    product_name REFERENCES product ,
    color    VARCHAR2(20) ,
    memory   VARCHAR2(20) ,
    in_stock NUMBER(3)
  );
Run Code Online (Sandbox Code Playgroud)

product_idproduct_name被隐式地定义为number引用该列product_id从塔product.由于product_name定义为a number,因此无法插入字符串"Nexus 4".

product_namestock表中有一列是没有意义的.它已经存在于product它所属的表中.它违反了规范化的基本规则,以在多个位置存储相同的信息.我强烈怀疑color并且也memory应该存在于product表中而不是stock表中.

您的DDL似乎是有效的语法(相当令人震惊),但它非常非常不寻常.多年来我一直在与Oracle打交道,我从未见过有人以这种方式创建表.它似乎是有效的,但是它会在你之后抛弃那些必须支持你的应用程序的人.明确是更合理的

CREATE TABLE stock
  (
    product_id NUMBER REFERENCES product( product_id ) ,
    product_name VARCHAR2(40) , -- This shouldn't be in this table
    color    VARCHAR2(20) , -- Nor should this
    memory   VARCHAR2(20) , -- Nor should this
    in_stock NUMBER(3)
  );
Run Code Online (Sandbox Code Playgroud)