我用以下查询创建了一个库存表
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
添加图片
最佳答案
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
表中。您的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)
);