如何在表中添加唯一标识符列?

Posted

技术标签:

【中文标题】如何在表中添加唯一标识符列?【英文标题】:How to add unique identifier column in table? 【发布时间】:2019-03-06 16:15:39 【问题描述】:

我有一个没有任何唯一标识符的表。我想向表中添加唯一列,我该如何实现?

我的桌子是这样的:

name age     gender      marital_status
SAM          M           Single
BOB          M           Married
JEN          F           Single
BOB          M           Married

我希望我的桌子是这样的:

id      name age     gender      marital_status
1        SAM          M           Single
2        BOB          M           Married
3        JEN          F           Single
4        BOB          M           Married

我想要唯一标识符的原因是因为一些记录是彼此重复的,我想删除重复的。

【问题讨论】:

添加 uid 不会删除重复项;您仍然需要这样做,并且具有防止添加重复项的逻辑。您可能已经知道所有这些,但还不清楚。 【参考方案1】:

您可以执行以下操作:

alter table t add id int;

create sequence t_seq;

update t set id = t_seq.nextval;

alter table t modify id primary key;

不幸的是,我认为 Oracle 不允许您将列放在列列表的开头。它总是添加到末尾。

【讨论】:

谢谢戈登。它有帮助,是的,它总是放在最后,但逻辑工作得很好。【参考方案2】:

演示表:

create table people (name, gender, marital_status)
as
select 'SAM', 'M', 'Single' from dual union all
select 'BOB', 'M', 'Married' from dual union all
select 'JEN', 'F', 'Single' from dual union all
select 'BOB', 'M', 'Married' from dual;

添加标识列(需要 Oracle 12.1 或更高版本):

alter table people add id integer generated always as identity;

如果您愿意,请重新排列字典顺序,以便在您描述表时首先出现新列(也需要 Oracle 12.1):

begin
    for r in (
        select column_name from user_tab_columns c
        where  c.table_name = 'PEOPLE'
        and    c.column_name <> 'ID'
        order by c.column_id
    )
    loop
        execute immediate 'alter table people modify ' || r.column_name || ' invisible';
        execute immediate 'alter table people modify ' || r.column_name || ' visible';
    end loop;
end;
/

【讨论】:

太棒了。你真棒

以上是关于如何在表中添加唯一标识符列?的主要内容,如果未能解决你的问题,请参考以下文章

唯一标识符更改时如何更新表?

如何更新没有任何数据的行以唯一标识该行?

尽管列在表中,但标识符无效

SQLServer 唯一键约束和唯一索引有啥区别

使用 C# 出现错误“无法在表中插入标识列的显式值”

来自两个表的 PL/SQL 唯一列标识