更新主键不是问题; SQL中(以及关系模型中)的所有值都应该是可更新的.
问题似乎是交换主键,其中
>如果你使用代理键(因为它们没有意义,所以没有必要更新)对我来说没有意义
>如果您使用自然键,对我来说没有意义,因为这就像将您的StackOverflow用户ID与您的用户交换一样.
在每个表中添加“ID”列对您没有帮助. “unique_key”列仍然必须声明为唯一.添加“ID”列不会更改该业务要求.
如果MySQL支持延迟约束,则可以交换主键值. (延迟约束是标准SQL中的一项功能.)但MySQL不支持该功能.例如,在PostgreSQL中,你可以这样做.
create table test (
unique_key char(1) primary key deferrable initially immediate,
other_column varchar(15) not null
);
insert into test values
('x', 'record2'),
('y', 'record1');
begin;
set constraints test_pkey deferred;
update test set unique_key = 'y' where other_column = 'record2';
update test set unique_key = 'x' where other_column = 'record1';
commit;
select * from test;
unique_key other_column
--
y record2
x record1