如何在 table 上正确设置主键?

How to set a primary key on a table correctly?

我有点困惑,我见过的所有平板电脑(我没见过多少)都有一个自增字段作为它们的主键。

这是设置主键的最佳方式吗?

例如,我有以下名为 Assets 的表用于库存,我不知道将字段设置为主键的最佳方法

问: 不知道是设置自增字段(indentity)为主键还是设置code字段为主键

方式一

CREATE TABLE Asset_A
(
    code INT NOT NULL,
    name VARCHAR(150),
    PRIMARY KEY(code)
);

方式二

CREATE TABLE Asset_B
(
    id INT IDENTITY,
    code INT NOT NULL, -- BUT THIS IS THE CODE OF ASSET. For SECOND PK?
    name VARCHAR(150),
    PRIMARY KEY(id)
);

code 字段是一个数字字段,其中为此资产设置了唯一 ID 例子: 姓名:iPhone10 代码:1000 等..

包含数据的表格示例:

GO
INSERT INTO Asset_A
    (code,name)
VALUES
    (1000, 'iphone 10'),
    (1001, 'iphone 11'),
    (1002, 'iphone 12'),
    (1003, 'Samsung Galaxy S8'),
    (1004, 'Samsung Galaxy S9'),
    (1005, 'Samsung Galaxy S10');
GO
INSERT INTO Asset_B
    (code,name)
VALUES
    (1000, 'iphone 10'),
    (1001, 'iphone 11'),
    (1002, 'iphone 12'),
    (1003, 'Samsung Galaxy S8'),
    (1004, 'Samsung Galaxy S9'),
    (1005, 'Samsung Galaxy S10');

GO
SELECT *
FROM Asset_A 

GO
SELECT *
FROM Asset_B

GO
sp_columns Asset_A;
GO
sp_columns Asset_B;

主键必须在table中是唯一的,并且在同一个table中没有第二个主键。您可以有另一个唯一的 non-clustered 索引,但不能有第二个主键。在这种情况下,如果保证 code 在每一行的所有其他列中都是唯一的,它将作为主键使用,您将不需要 IDENTITY 列。

我建议对主键以及如何选择它们做一些额外的研究。当然,设置 IDENTITY 的列不一定是主键。但是也有限制,比如SQL服务器中的PK不能大于900字节。

你的问题不是经验不足导致的简单问题。这是一个判断电话。

表示已经存在的资产的密钥称为“自然”密钥,在您的例子中是 [code]。 system-generated 键称为“代理”键,在您的情况下为 [id]。

您应该使用代理键还是坚持使用自然键?好吧,每个都有其优点和缺点,这是一场巨大的辩论,您会找到大量的资料来源。我个人的最好成绩 link 是 this。评论中还有其他 link ,可能会在其他答案中。也多上网搜索一下。

如果我不得不根据自己的经验以及我认为您的 [code] 有多“重要”来为您选择,我确实会使用 [code] 而不是代理。但是,这是主观的。阅读、学习、练习,这些类型的判断调用会变得更容易。