删除主键约束后列会发生什么情况?
What should happen with a column after the primary key constraint was removed?
我说的是主键的规范化。所以假设我的主键列是 nvarchar 类型,这违反了规范化规则。从所需列中删除主键约束和标识规范后。我需要创建一个新列,它将成为 table.
的新主键
我的问题是,之前的主键应该怎么办?
我得到的答案听起来像:"the column should became a semantic key",但我听不懂这个答案。
在设计数据库模式时使用 SURROGATE 主键的情况并不少见。这个想法是给每条记录一个唯一和永久的标识符,这样它就可以很容易地被应用程序和外键引用。这个键没有意义。知道代理键不会为您提供有关记录内容的信息。您的应用程序的用户永远不会看到这个值。
另一方面,您的记录可能有语义主键。这是一个唯一值,用于标识对用户有意义的数据。
例如,假设您有 table 名员工。雇主为每位员工分配一个唯一的员工 ID 号。假设您将此值存储为字符串。对于用户而言,该值用作引用该员工的唯一标识符。同时,您的 table 可能有一个数字列用作该记录的唯一标识符。
create table Employee ( EmployeeRecordID int identity(1,1) primary key,
EmployerAssignedID nvarchar(12),
EmployeeName nvarchar(60),
Salary money )
insert into Employee ( EmployerAssignedID, EmployeeName, Salary ) values
( '#ABC100', 'Fred', 25000.12 ),
( '#AZZ314', 'Mary', 37700.00 ),
( '#MAA719', 'Fran', 34444.04 ),
( '#MZA977', 'Mary', 36000.00 )
添加每条记录时,SQL 服务器为每条记录生成一个唯一的 EmployeeRecordID,从 1 开始。这是 SURROGATE 键。在您的数据库和应用程序中,您将使用此值来引用记录。
但是当您的应用程序与用户通信时,您会使用 EmployerAssignedID。这是语义主键。您的用户可以使用此值来搜索特定员工。
主键只不过是一个唯一索引,不能将 NULL
值作为键。与任何索引一样,它可以是聚集的或非聚集的。
删除聚簇索引会使table成为结构和行为发生变化的堆。删除非聚集索引只是释放其 space 并且不会影响 table 和 table 上的其他索引。
因此,在删除之后,您只有一个具有唯一值的列,您可以将它们视为语义键,直到插入一些重复值。
我说的是主键的规范化。所以假设我的主键列是 nvarchar 类型,这违反了规范化规则。从所需列中删除主键约束和标识规范后。我需要创建一个新列,它将成为 table.
的新主键我的问题是,之前的主键应该怎么办? 我得到的答案听起来像:"the column should became a semantic key",但我听不懂这个答案。
在设计数据库模式时使用 SURROGATE 主键的情况并不少见。这个想法是给每条记录一个唯一和永久的标识符,这样它就可以很容易地被应用程序和外键引用。这个键没有意义。知道代理键不会为您提供有关记录内容的信息。您的应用程序的用户永远不会看到这个值。
另一方面,您的记录可能有语义主键。这是一个唯一值,用于标识对用户有意义的数据。
例如,假设您有 table 名员工。雇主为每位员工分配一个唯一的员工 ID 号。假设您将此值存储为字符串。对于用户而言,该值用作引用该员工的唯一标识符。同时,您的 table 可能有一个数字列用作该记录的唯一标识符。
create table Employee ( EmployeeRecordID int identity(1,1) primary key,
EmployerAssignedID nvarchar(12),
EmployeeName nvarchar(60),
Salary money )
insert into Employee ( EmployerAssignedID, EmployeeName, Salary ) values
( '#ABC100', 'Fred', 25000.12 ),
( '#AZZ314', 'Mary', 37700.00 ),
( '#MAA719', 'Fran', 34444.04 ),
( '#MZA977', 'Mary', 36000.00 )
添加每条记录时,SQL 服务器为每条记录生成一个唯一的 EmployeeRecordID,从 1 开始。这是 SURROGATE 键。在您的数据库和应用程序中,您将使用此值来引用记录。
但是当您的应用程序与用户通信时,您会使用 EmployerAssignedID。这是语义主键。您的用户可以使用此值来搜索特定员工。
主键只不过是一个唯一索引,不能将 NULL
值作为键。与任何索引一样,它可以是聚集的或非聚集的。
删除聚簇索引会使table成为结构和行为发生变化的堆。删除非聚集索引只是释放其 space 并且不会影响 table 和 table 上的其他索引。
因此,在删除之后,您只有一个具有唯一值的列,您可以将它们视为语义键,直到插入一些重复值。