我正在阅读有关 SQL 的书籍并找到此表:
CREATE TABLE Products
(
prod_id char(10) NOT NULL ,
vend_id char(10) NOT NULL ,
prod_name char(255) NOT NULL ,
prod_price decimal(8,2) NOT NULL ,
prod_desc varchar(1000) NULL
);
1) 为什么prod_id
, vend_id
,prod_name
不是varchar
, 但是char
?
2) 为什么 prod_price 是十进制而不是数字,比如数字更好?如果错了请纠正我。
据我所知,PostgreSQL 建议 varchar 和 text?
检查我是否正确地为 PostgreSQL DBMS 制作了一个表?
CREATE TABLE Products
(
prod_id varchar(10) NOT NULL ,
vend_id varchar(10) NOT NULL ,
prod_name varchar(255) NOT NULL ,
prod_price numeric(8,2) NOT NULL ,
prod_desc text NULL
);
一种类型不可能比他自己好。该类型
decimal
本身不存在,它是 的numeric
同义词。因为这是 SQL 标准的要求,所以有两个。char
,varchar
并且text
是相当近的亲戚。根据标准的要求char
,无论写入的数据量如何,类型始终由固定大小的字符表示。只是为了这个非常有限的适用性 - 为什么总是花费char(255)
从 256 到 1024 字节(记得我说过“固定大小的字符”?它是字符,而不是磁盘上的字节。在 postgresql 的磁盘上它仍然是数据可变长度)是否会在 20 个字节上写下 10 个字符的一行?浪费空间和内存。其他一些 DBMS 可能会从处理固定宽度数据中受益,但这不适用于 PostgreSQL,并且char
在此处varchar
或text
.这是一个数据库模式设计决策。例如,同样令人惊讶的是 text
prod_id
和vend_id
,缺少主键和外键在我看来,最好是这样:
char(10)
- 因为它们每个正好有 10 个字符 - 它看起来像其他表中的键,你还应该写一个外键。varchar
- 因为长度是可变的。varchar
值得替换为nvarchar
,因为这些字段可能包含 unicode。附加信息。decimal(8,4)
- 对于金钱,传统上使用 4 个小数位。numeric
/decimal
也不text
是最新的。