当我已经有一个索引时,如何以及为什么将主键添加到我的 SQL 数据库 table

How and why to add primary keys to my SQL database table when I already have an index

我有以下 sql table 称为 datatable,

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

当我创建 table 时,我设置了以下内容,

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)

我的问题是我为什么要这样做,这和我创建的索引有什么区别。它会影响我的进程吗?

此外,下次我创建 table 时,是否必须像这样创建索引和主索引,或者有没有办法在创建时同时执行这两项操作?

主键是一种约束,指定其列中的值必须(相互)唯一且不为空。这样可以保证唯一标识 table 中的每一行,这在想要创建引用此 table 的外键时最有用。如果您没有其他 table,它仍然值得拥有,因为它会阻止您的 table 进入不良状态,例如,您在具体日期。

主键字段几乎总是有一个索引,并且它们经常用于查找和 JOIN,但这两个概念是分开的。

一些 DBMS(例如 MySQL、SQL 服务器)自动在主键上创建聚簇索引,这意味着 table 中的数据在磁盘上按字段( s) 包含主键,使上述常见操作更快。 However, postgres does not do this by default.

您可以使用以下语法在 table 创建时指定主键:

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, 
    yesterday real, 
    today real, 
    tomorrow real, 
    reading real, 
    source varchar
)