当前位置: 首页 > 面试题库 >

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

庞瀚
2023-03-14
问题内容

我有一张桌子regionkey

areaid  -- primary key, int
region  -- char(4)
locale  -- char(4)

数据库的其余整个部分都用外键键入areaid。在此表中,有一个具有唯一约束的(区域,区域设置)索引。

问题是我有两条记录:

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);


 类似资料:
  • 问题内容: 我有一个带有优先级列的“任务”表,该表具有唯一的约束。 我试图交换两行的优先级值,但我一直违反约束。我在类似情况下的某个地方看到了该语句,但MySQL却没有。 这将导致错误: 是否可以在MySQL中完成此操作而不使用伪造的值和多个查询? 编辑: 这是表的结构: 问题答案: 是否可以在MySQL中完成此操作而不使用伪造的值和多个查询? 不 (我想不到的)。 问题是MySQL如何处理更新。

  • 问题内容: 目标: 交换两个记录的主键,而不会遇到ORA-00001:违反了唯一约束。“可行”的解决方案(在下文中)只是一个破解。是否有一项功能/技术可以将约束执行推迟到提交事务之前? motivation -使用此数据的遗留应用程序存在设计缺陷,并且依赖于ID顺序和值-请求是按以下方式交换PK值: What doesn’t Work: Hack/Solution that ‘works’ Tab

  • 我正在使用Hibernate 4.0最终版和ojdbc6来开发我的网络应用程序。一切都好,除了当我试图插入一个新的父母/孩子的关系。首先,这些是实体: 让我们看看这两个场景: 员工已存在,我尝试向其添加新地址-- 这是事务处理程序: 你可以想象,2.b的案子是我关心的。我已经调试了事务,这是我调用保存()方法(在DAO类中)时得到的: 会议结束了。saveOrUpdate(employee)方法成

  • 我正在使用Spring和Hibernate,我得到了这个例外。以下是我试图获得的:我有User和UserSettings类,它们以OneToMany和ManyToOne注释为界,如下所示: 现在,我想为用户添加设置,我是这样做的: 问题来了:UserSettings中的用户持有旧设置和新设置的集合(设置,我刚刚创建并想要添加),但旧设置持有用户的集合,其中没有新设置。我想这就是为什么我会遇到异常,

  • 我有一个MathematicsAnswer引用的实体数学。如果对数学执行post请求,我会得到一个例外,即MathsAnswer上的字段不能为空。但我确实在球场上跳了起来。拜托,我需要这个解决方案<代码>java.sql。SQLIntegrityConstraintViolationException:列'question_id'不能为空。 sql架构: 实体类: MathsAnswers.jav

  • 问题内容: 我正在使用Hibernate 4.0 Final和ojdbc6开发我的Web应用程序。一切正常,除非我尝试插入新的父/子关系。首先,这些是实体: 让我们看看这两种情况: 一名员工已经存在,我尝试向其添加新地址->正常工作。 员工不存在,我尝试创建一个新员工。两种不同的情况: a)我只插入一名雇员(无地址)->可以正常工作。 b)我插入并添加了employee及其地址-> 失败 。我必须