如何删除重复项,并更新引用SQL中这些重复项的记录

use*_*943 9 sql h2

我有两张桌子:

User:(int id, varchar unique username)

Items: (int id, varchar name, int user_id)
Run Code Online (Sandbox Code Playgroud)

目前,用户表中存在不区分大小写的重复项,如:

1,John
2,john
3,sally
4,saLlY
Run Code Online (Sandbox Code Playgroud)

然后Items表将有

1,myitem,1
2,mynewitem,2
3,my-item,3
4,mynew-item,4
Run Code Online (Sandbox Code Playgroud)

我已经更新了插入用户表的代码,以确保它始终插入小写.

但是,我需要迁移数据库,以便从用户表中删除重复项,并更新项目表引用,以便用户不会失去对其项目的访问权限

IE迁移后的数据将是:

用户:

1,john
3,sally
Run Code Online (Sandbox Code Playgroud)

项目

1,myitem,1
2,mynewitem,1
3,my-item,3
4,mynew-item,3
Run Code Online (Sandbox Code Playgroud)

由于用户表具有唯一约束,因此我不能将其设置为更低

update public.user set username =lower(username)
Run Code Online (Sandbox Code Playgroud)

小智 1

我不擅长H2。您可以尝试为 SQL Server 编写此代码,并且数据库区分大小写、区分重音。

create table t_user(id int not null identity(1,1), username varchar(25) unique);
alter table t_user add constraint pk_id_user primary key(id);

create table t_items(id int not null identity(1,1), name varchar(25), user_id int);
alter table t_items add constraint pk_id_items primary key(id);
alter table t_items add constraint fk_user_id foreign key(user_id) references t_user(id);

insert into t_user (username) values ('John'), ('john'), ('sally'), ('saLlY');
insert into t_items (name, user_id) values ('myitem', 1), ('mynewitem', 2), ('my-item', 3), ('mynew-item',4);

select * from t_user
select * from t_items

create table t_user_mig(id int not null identity(1,1), username varchar(25) unique);
alter table t_user_mig add constraint pk_id_user_mig primary key(id);

create table t_items_mig(id int not null identity(1,1), name varchar(25), user_id int);
alter table t_items_mig add constraint pk_id_items_mig primary key(id);
alter table t_items_mig add constraint fk_user_id_mig foreign key(user_id) references t_user_mig(id);

insert into t_user_mig select distinct lower(username) from t_user
insert into t_items_mig
select ti.name, (select id from t_user_mig where username = lower(tu.username)) 
from t_items ti, t_user tu 
where ti.user_id = tu.id

select * from t_user_mig
select * from t_items_mig
Run Code Online (Sandbox Code Playgroud)

我将您的表user, items替换为t_user, t_items。这些表迁移到t_user_mig、t_items_mig

你可以在H2中尝试一下。我会感谢您的反馈。

我希望它能有所帮助。