我用以下查询创建了一个库存表

CREATE TABLE stock
  (
    product_id REFERENCES product ,
    product_name REFERENCES product ,
    color    VARCHAR2(20) ,
    memory   VARCHAR2(20) ,
    in_stock NUMBER(3)
  );


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

insert into stock values(8881,'Nexus 4','Black','2GB-16GB',3);


它给出了ORA-01722:无效数字错误,我知道为什么会出现错误,但是我无法弄清楚我做错了什么

产品表:

product_id ..number , product_name .. varchar2


添加图片

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

最佳答案

product_idproduct的主键,并且是number列。定义表格时

CREATE TABLE stock
  (
    product_id REFERENCES product ,
    product_name REFERENCES product ,
    color    VARCHAR2(20) ,
    memory   VARCHAR2(20) ,
    in_stock NUMBER(3)
  );


product_idproduct_name都被隐式定义为number列,它们引用product_id中的product列。由于product_name被定义为number,因此无法插入字符串“ Nexus 4”。

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

您的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)
  );

09-26 23:12
查看更多