回答

收藏

交换两个数据库行而不违反约束

技术问答 技术问答 321 人阅读 | 0 人回复 | 2023-09-14

我有一张桌子regionkey:
" K1 B% y+ Y: R* d' ~/ eareaid  -- primary key, int4 P! {3 V3 i. |' \
region  -- char(4)3 }/ \0 Z) k+ _! S$ a, p# \
locale  -- char(4)3 e8 ^2 Q" r, B" x6 c6 L
数据库的其余整个部分都用外键键入areaid。在此表中,有一个具有唯一约束的(区域,区域设置)索引。8 F6 G! o8 W- _; G: r% ?
问题是我有两条记录:% f8 M5 m) H9 m* |$ R) R
101   MICH   DETR
1 ?, M0 V0 H5 h7 y% A0 E+ J) j4 {- w102   ILLI   CHIC& x* v- K& w, c" e2 o/ T
我需要在它们之间交换(region,locale)字段,这样我才能得出:" r" ^6 e$ _+ @( P
101   ILLI   CHIC$ |3 r! c* G! i- x( R+ `% U
102   MICH   DETR
+ j$ i! U2 u: O! E) x) S天真的方法行不通,因为它违反了区域和??语言环境的唯一索引:3 `2 U7 p& `) [3 u4 h7 }
update regionkey+ j2 Q, c( b6 s; ^+ C& u. ]
     set region='ILLI', locale='CHIC' where areaid = 101; -- FAILS4 D) W9 C+ P+ d# V: P
update regionkey
7 c, F7 H/ K6 o" ?5 a9 E0 ^- f# [* P     set region='MICH', locale='DETR' where areaid = 102;
# U' e; I: G: e1 T我怎样才能做到这一点?是否有原子方式进行交换?有什么建议吗?
2 b! E) ?! B$ c( G" \               
2 |% H. {1 D' y7 _' @  [, }* v解决方案:
7 d) ~0 z% X, }1 J7 s                ( M$ i" @; b2 V# Y# i) J

& `2 X* ^0 i. r7 ^& z& G$ D/ }. y& W$ k- m7 l4 @+ S+ L
                您不能在SQL Server中推迟对多个语句的约束检查(除非您禁用),所以您必须避免冲突或在一个语句中执行5 [. L5 b+ G/ Q
update
8 P+ d# o1 J! Y/ r4 z% V    regionkey $ g! [9 r1 M- i% q
set0 e8 w+ [# N/ o4 b
    region= CASE areaid WHEN 101 THEN 'ILLI' ELSE 'MICH' END, , t* N( Z" k& I; {+ _7 n
    locale= CASE areaid WHEN 101 THEN 'CHIC' ELSE 'DETR' END% P0 |9 A3 h; S' R6 P* z# U5 d$ Y- ^
where/ o1 v! k- v0 E* x3 l& n
    areaid IN (101, 102);" t7 ^2 V6 V2 W7 ~' j3 K
或者,更常规地(在交易中)) u: Q3 K; {" r& I  b1 ?
update regionkey
' f( U# f, k$ J     set region='AAAA', locale='BBBB' where areaid = 101;. P7 Z4 F3 c  V% K$ D4 O( _
update regionkey ) s( J9 ]: C. K& h
     set region='MICH', locale='DETR' where areaid = 102;
  U, H9 u. K# }+ }update regionkey ( U+ }2 R3 |; C7 z6 ]0 b
     set region='ILLI', locale='CHIC' where areaid = 101;/ r# N: ?# s8 c& a. }( D: ?
编辑:为什么不交换键而不是值?除非Areaid具有某些含义,否则通常可以达到理智的结果/ }3 }1 M2 l; J# g: d5 Z- L
update  d8 M# R3 E: y$ A* y' C! l- X
    regionkey
9 r" l, L3 C  }( D0 K# A. Jset
2 S! n2 L* `9 ^    areaid = 203 - areaid : \; V  x6 y) m- N/ j( `
where2 X% o) o; i7 [6 q
    areaid IN (101, 102);
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则