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:向数据库表添加新的主键列的主要内容,如果未能解决你的问题,请参考以下文章