我正在构建一个数据库管理工具供客户自己使用,而且我在处理更新主/唯一密钥的可能性时遇到了一些问题。因此,鉴于更新的数据是由每个行的PHP脚本传递的,这就是我所提出的(从“立即”到“一段时间后”):
DELETE / INSERT而不是UPDATE(糟糕,我现在......):
DELETE FROM table WHERE unique_key=x;
DELETE FROM table WHERE unique_key=y;
INSERT INTO table VALUES (unique_key=y, field=record1), (unique_key=x, field=record2);
更改我的主/唯一密钥,然后用修改后的值替换它们:
UPDATE table SET unique_key=x* WHERE unique_key=x;
UPDATE table SET unique_key=y* WHERE unique_key=y;
UPDATE table SET unique_key=y WHERE unique_key=x*;
UPDATE table SET unique_key=x WHERE unique_key=y*;
就像现在一样,我正在为一切添加“id”字段。其他选择?
答案 0 :(得分:1)
更新主键不是问题; SQL中(以及关系模型中)的所有值都应该是可更新的。
问题似乎是交换主键,
为每个表添加“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
答案 1 :(得分:0)
您应该能够使用CASE表达式来执行此类更新。例如:
UPDATE tbl SET col =
CASE WHEN col = 1 THEN 2
WHEN col = 2 THEN 1
END
WHERE col IN (1,2);
(未经测试的代码)