我有一张桌子regionkey
:
areaid -- primary key, int
region -- char(4)
locale -- char(4)
数据库的整个其余部分都是areaid 的外键。在此表中,有一个关于 (region, locale) 的索引,具有唯一约束。
问题是我有两条记录:
101 MICH DETR
102 ILLI CHIC
我需要在它们之间交换 (region,locale) 字段,这样我最终会得到:
101 ILLI CHIC
102 MICH DETR
这种简单的方法是行不通的,因为它违反了区域和语言环境的唯一索引:
update regionkey
set region='ILLI', locale='CHIC' where areaid = 101; -- FAILS
update regionkey
set region='MICH', locale='DETR' where areaid = 102;
我怎样才能做到这一点?有没有一种原子的方式来进行交换?建议?
您不能在 SQL Server 中推迟对多个语句的约束检查(除非您禁用),因此您必须避免冲突或在一个语句中执行此操作
update
regionkey
set
region= CASE areaid WHEN 101 THEN 'ILLI' ELSE 'MICH' END,
locale= CASE areaid WHEN 101 THEN 'CHIC' ELSE 'DETR' END
where
areaid IN (101, 102);
或者,更传统地(在一笔交易中)
update regionkey
set region='AAAA', locale='BBBB' where areaid = 101;
update regionkey
set region='MICH', locale='DETR' where areaid = 102;
update regionkey
set region='ILLI', locale='CHIC' where areaid = 101;
编辑:为什么不交换键而不交换值?除非areaid有某种意义,否则它通常会达到合理的结果
update
regionkey
set
areaid = 203 - areaid
where
areaid IN (101, 102);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)