我使用以下查询创建了一个股票表
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
添加图片
答案 0 :(得分: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)
);
product_id
和product_name
被隐式定义为引用number
product_id
列的product
列。由于product_name
被定义为number
,因此您无法插入字符串" Nexus 4"。
product_name
表中有stock
列是没有意义的。它已经存在于它所属的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)
);
答案 1 :(得分:1)
references
的定义表示您的语法无效:http://psoug.org/definition/REFERENCES.htm。
它如何知道产品中哪一列符合要求?你需要告诉它。
使用此方法转到您创建的其中一个表并将其编写为脚本,您将看到需要指定列。如果没有引用
中的列,您将找不到任何创建脚本您的DDL与屏幕截图不符。屏幕截图为Category_ID
,而您的DDL没有。{/ p>
如果您正在针对表 screenshot 运行没有目标列列表的样本INSERT
语句,那么这将解释您的错误。
从不永远编码没有目标列列表的插入。它会引发错误。 (更不用说它让你看起来很懒惰)