使用 SQL 在现有表中创建和填充主键列

Posted

技术标签:

【中文标题】使用 SQL 在现有表中创建和填充主键列【英文标题】:Creating and populating a primary key column in an existing table using SQL 【发布时间】:2021-07-23 08:23:00 【问题描述】:

问题

我不能 100% 确定如何在现有表中创建一个可以充当唯一主键的列,并希望验证我的以下方法是否可行,并就可能的更好方法提出建议/建议(如果适用)这样做。

场景

假设我有一个如下所示的现有表 (tbl_employee)

Employee Name    Location
------------------------------
John              London
Sharath           New York
Nivas             Mumbai
Praveen           Texas
Maharaj           Las Vegas

我想在这个表中添加一个列,它可以作为主键,看起来像这样

EmployeeID
-----------
1
2
3
4
5

试过

为表创建一列,将该列指定为主键。不确定这是否会按预期工作?验证/可能的改进建议将不胜感激。


-- Purpose of this is to add an EmployeeID to the existing table (values such as shown above)
-- Set the EmployeeID as the primary key of the table (no primary key already exists)

ALTER TABLE tbl_employee ADD EmployeeID int IDENTITY(1,1) NOT NULL
ADD CONSTRAINT PK_tbl_employee_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID);

【问题讨论】:

您是否有任何特定的列可以订购employee_id? 您可以在创建表后添加IDENTITY 是的。请记住,分配给每一行的值将是完全任意的。正如您暗示在您的表上没有CLUSTERED INDEX,此时数据存储在无序堆中。 哦,好的。是的,我没有实际的列来订购 EmployeeID。这是一个问题吗?您能否创建一个可能进一步解释这一点的答案?我对 SQL 还很陌生。 你需要明确你想要什么样的验证(如果有的话)?例如,如果有人尝试添加另一个名为 John 的员工,您是否希望它只是为该行创建一个新的employeeID(即使它可能是现有员工的重复记录),还是因为主键违规而失败? 当然,我认为在这种情况下,我希望它只创建一个新的 EmployeeID,但也想知道如果主键违规也会导致失败。我展示的示例是为了便于理解问题而过度简化。也许虽然这导致了歧义。 【参考方案1】:

使用

ALTER TABLE tbl_employee 
ADD EmployeeID int IDENTITY(1,1) NOT NULL 
CONSTRAINT PK_tbl_employee_EmployeeID  PRIMARY KEY (EmployeeID);

ALTER TABLE tbl_employee
ADD EmployeeID int IDENTITY(1,1) NOT NULL;

ALTER TABLE tbl_employee
ADD CONSTRAINT PK_tbl_employee_EmployeeID PRIMARY KEY (EmployeeID);

要创建索引,请使用以下命令,而不是在列定义中使用CLUSTERED

CREATE INDEX idx__tbl_employee_EmployeeID
ON tbl_employee (EmployeeID);

终于

使用 Identity 属性添加一列作为主键,并在一个位置为其创建索引

ALTER TABLE tbl_employee ADD EmployeeID int IDENTITY(1,1) NOT NULL
CONSTRAINT PK_tbl_employee_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID)

【讨论】:

如果该列被声明为主键,则不需要创建索引。它有自己的索引,任何unique 列也是如此。 在定义主键时,我从 SQL 中的表定义中得到的自动脚本中没有看到任何索引指示。也就是说,表的定义在外观上是有区别的,即使不需要。

以上是关于使用 SQL 在现有表中创建和填充主键列的主要内容,如果未能解决你的问题,请参考以下文章

sQL数据库表的主键列设为标识,增量为1,下次插入数据时能不插入主键列吗

如何在 sql server 中设置外键列的默认值?

在主键列(表)中插入重复值时在 SQL Server 中返回哪个错误代码

sql主键列自增问题

SQL:主键列。人工“Id”列与“Natural”列[重复]

将自动增量主键插入现有表