使用 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 中返回哪个错误代码