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

时间:2015-08-04 04:41:13

标签: sql oracle oracle11g

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

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

添加图片

enter image description here

2 个答案:

答案 0 :(得分:5)

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表中。它违反了规范化的基本规则,以在多个位置存储相同的信息。我强烈怀疑colormemory也应该存在于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)
  );

答案 1 :(得分:1)

references的定义表示您的语法无效:http://psoug.org/definition/REFERENCES.htm

它如何知道产品中哪一列符合要求?你需要告诉它。

使用此方法转到您创建的其中一个表并将其编写为脚本,您将看到需要指定列。如果没有引用

中的列,您将找不到任何创建脚本

您的DDL与屏幕截图不符。屏幕截图为Category_ID,而您的DDL没有。{/ p>

如果您正在针对表 screenshot 运行没有目标列列表的样本INSERT语句,那么这将解释您的错误。

从不永远编码没有目标列列表的插入。它会引发错误。 (更不用说它让你看起来很懒惰)