问题描述
date yesteday today tomorrow reading source
2021-01-01 x x x x 1
2021-01-01 x x x x 2
2021-01-01 x x x x 3
...
2021-01-02 x x x x 1
2021-01-02 x x x x 2
2021-01-02 x x x x 3
...
2021-05-31 x x x x 1
2021-05-31 x x x x 2
2021-05-31 x x x x 3
当我创建表时,我设置了以下内容,
create table datatable
(
date date,yesterday real,today real,tomorrow real,reading real,source varchar
)
然后我创建了一个索引:
create index datatable_idx on datatable (date,source)
每天,源编号都会重复。所以日期和来源将是唯一的。
我想改进我的数据收集和存储过程。有人告诉我应该创建一个主键。
我猜这里使用的命令是
ALTER TABLE datatable ADD PRIMARY KEY (date,source)
我的问题是我为什么要这样做,这与我创建的索引有什么区别。会影响我的流程吗?
另外,下次我创建表时,我是否必须像这样创建索引和主索引,或者有没有办法在创建时同时创建?
解决方法
主键是一个约束,指定其列中的值必须(相互)唯一且不为空。这样可以保证唯一标识表中的每一行,这在想要创建引用此表的外键时最有用。如果您没有其他表,它仍然值得拥有,因为它可以防止您的表进入不良状态,例如,您在特定日期拥有多个相同的源值。
主键字段几乎总是有一个索引,它们经常用于查找和联接,但这两个概念是分开的。
一些 DBMS(例如 MySQL、SQL Server)会自动在主键上创建聚集索引,这意味着表中的数据在磁盘上按组成主键的字段进行排序,以使上述常见操作更快. However,postgres does not do this by default.
您可以使用以下语法在创建表时指定主键:
create table datatable
(
date date,yesterday real,today real,tomorrow real,reading real,source varchar,PRIMARY KEY (source,date)
)
您还可以添加一个新的、自动递增的整数字段作为您的主键(通常称为代理键或人工键)。如果您的数据项中没有任何其他合适的候选对象,您可能想要这样做,但它也有其他好处(例如可能更快的 JOIN)。
create table datatable
(
id serial primary key,date date,source varchar
)