SQL:向数据库表添加新的主键列

Posted

技术标签:

【中文标题】SQL:向数据库表添加新的主键列【英文标题】:SQL: Add new Primary Key Column to Database Table 【发布时间】:2019-03-23 05:59:38 【问题描述】:

我有一个包含几列的数据库表,其中一些列用于一起形成主键。现在模型发生了变化,引入了一个名为“id”的主键列。

当我更改表并添加列时,每行中都会使用默认值 0 或 NULL 填充该列,因此它不能用作新主键的候选者。为此,我必须在每一行中为“id”设置不同的(数字)值。我怎样才能做到这一点,最好尽可能通用(mysql、Oracle、SQL Server)。

【问题讨论】:

将代理键列添加到表中的哲学可以跨平台转换,但要执行的代码将是相当特定于平台的.例如,Oracle 和 Microsoft 都有可用的 SEQUENCE 对象和 IDENTITY 列,尽管语法不同。 MySQL 使用 AUTO_INCREMENT 而不是 IDENTITY 并且根本没有 SEQUENCE 对象。您是在寻找通用的理论答案,还是针对您所在平台的特定解决方案? 我建议您使用比“id”更好的名称。当列根据它们所在的表更改名称时,这是我的一个小烦恼。如果你说一个 Claims 表,那么无论它在哪个表中,ClaimID 都是一个 ClaimID。但是手头的任务很复杂,因为你有处理所有关系值。这不是一项小任务。您必须以正确的顺序更新表并删除受影响表上的现有主键和外键。然后分配新的外键值。这并不像听起来那么容易。但并非不可能。 名称“id”实际上不是我在内部使用的名称。而且,是的,我正在寻找一个通用的理论答案。 除了我上面评论中的 2-3 句话之外,这对于通用答案来说太宽泛了。这将取决于本地方言(这意味着您正在使用的每个 DBMS 都会发生一些变化)并且在逻辑上具有挑战性以保持关系数据的相关性。 【参考方案1】:

以下是如何添加作为主键填充的标识列的示例。

create table #t (vals varchar(100))

insert into #t
values('a'),('b'),('c')

alter table #t
add ID int identity primary key

select * from #t

结果:

vals    ID
a   1
b   2
c   3

这是一个 SQL Server 答案。我不知道其他数据库是如何工作的。

【讨论】:

如果您已经定义了复合主键,那么您必须在创建新主键之前删除该索引。【参考方案2】:
CREATE TABLE Persons (
    ID int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
); 

这可能会有所帮助。 MS SQL Server 使用IDENTITY 关键字来执行自动增量功能。

在上面的例子中,IDENTITY 的起始值为 1,每增加一条新记录,它就会增加 1。

提示:要指定“ID”列应从值 10 开始并以 5 为增量,请将其更改为 IDENTITY(10,5)

要在“Persons”表中插入新记录,我们不必为“ID”列指定值(将自动添加唯一值):

【讨论】:

以上是关于SQL:向数据库表添加新的主键列的主要内容,如果未能解决你的问题,请参考以下文章

SQL 外键名称问题

SQL的主键,约束 有啥用

怎样将ms sql的主键设置为每次自增加1

sql主键列自增问题

在 H2 数据库引擎中为 UUID 类型的主键列指定默认值?

将自动递增的主键插入 Access 表