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)
添加图片
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_id和product_name被隐式地定义为number引用该列product_id从塔product.由于product_name定义为a 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)
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1411 次 |
| 最近记录: |