我有两张桌子:
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中尝试一下。我会感谢您的反馈。
我希望它能有所帮助。