oracle defered constraint

本文探讨了在数据库中更新具有唯一性约束字段时遇到的问题,并提供了几种有效的解决方案。通过使用CASE WHEN语句或者设置DEFERRABLE INITIALLY DEFERRED约束检查方式,可以在同一事务中成功更新两个值。
今天同事遇到一个问题,发现UI可能需要交互一个有唯一性约束的column的两个值,比如叫id,一个值是1,一个是2,UI传过来的是两句update(其实是一个batch里面做的)。由于是同一个transaction,就会报错。解决办法是参考了http://www.rhinocerus.net/forum/databases-oracle-misc/327785-problem-updating-unique-values.html:

This works fine on 9i:

CREATE TABLE primes (
rank INT NOT NULL PRIMARY KEY,
prime INT NOT NULL);

INSERT INTO primes VALUES (1,3);
INSERT INTO primes VALUES (2,2);
COMMIT;

ALTER TABLE primes
ADD CONSTRAINT unique_prime
UNIQUE (prime) DEFERRABLE INITIALLY DEFERRED;

UPDATE primes SET prime = 2 WHERE rank = 1;
UPDATE primes SET prime = 3 WHERE rank = 2;
COMMIT;

Without deferrable constraint checking, this would also work:

UPDATE primes
SET prime = CASE rank WHEN 1 then 2 ELSE 3 END
WHERE rank IN (1,2);

自己去试的时候发现
UPDATE primes SET prime = 2 WHERE rank = 1;
UPDATE primes SET prime = 3 WHERE rank = 2;
COMMIT;
可以成功,但是
UPDATE primes SET prime = 2 WHERE prime = 3;
UPDATE primes SET prime = 3 WHERE prime = 2;
COMMIT;
这样发现不行,好奇怪,先mark,有空再查
在AUTOSAR中,**Deferred Data Type(延迟数据类型)**是一种特殊的数据类型定义机制,主要用于解决**跨模块或跨架构版本的数据类型依赖问题**。它的核心作用是**允许数据类型的定义被延迟到后续阶段(如运行时或配置阶段)明确**,而不是在编译时强制要求完整定义。 --- ### **Deferred Data Type的核心特性** 1. **延迟解析**: - 传统数据类型(如`Application Data Type`或`Implementation Data Type`)需要在配置阶段完全定义,而`Deferred Data Type`允许部分信息(如基类型、大小)暂时不明确,后续通过引用或动态解析补全。 - 适用于**跨模块交互**或**动态配置场景**,例如: - 模块A定义了一个接口,但接口中使用的数据类型由模块B在后续阶段提供。 - 数据类型的具体实现依赖硬件或编译器特性,需在生成代码时确定。 2. **避免循环依赖**: - 在复杂的AUTOSAR架构中,模块间可能存在循环依赖(如模块A依赖模块B的类型,模块B又依赖模块A的类型)。`Deferred Data Type`通过“占位符”机制打破这种循环,允许先声明后定义。 3. **支持动态配置**: - 某些数据类型(如校准参数、动态数组大小)可能在运行时才能确定,`Deferred Data Type`为这种场景提供了灵活性。 --- ### **Deferred Data Type的应用场景** 1. **跨模块接口定义**: - 例如:`EcuM`(ECU管理模块)定义了一个接口,其中包含一个由`BswM`(BSW模式管理模块)提供的数据类型。此时,`EcuM`可以先使用`Deferred Data Type`声明该类型,待`BswM`定义完成后再关联。 2. **硬件相关数据类型**: - 某些数据类型的存储格式(如`uint32` vs `uint64`)依赖目标硬件的寄存器宽度。`Deferred Data Type`允许在硬件抽象层(HAL)配置完成后才确定具体类型。 3. **动态校准参数**: - 如`Dem`(诊断事件管理模块)中的故障阈值,可能在运行时通过标定工具修改。`Deferred Data Type`可以延迟其存储格式的定义,直到标定数据加载时确定。 --- ### **Deferred Data Type的实现方式** 在AUTOSAR的ARXML配置文件中,`Deferred Data Type`通常通过以下方式定义: 1. **占位符声明**: - 先定义一个`Deferred Data Type`,仅包含名称和基本属性(如`CATEGORY="DEFERRED"`),不指定具体实现。 ```xml <IMPLEMENTATION-DATA-TYPE> <SHORT-NAME>DeferredType</SHORT-NAME> <CATEGORY>DEFERRED</CATEGORY> <!-- 其他属性暂不填写 --> </IMPLEMENTATION-DATA-TYPE> ``` 2. **后续关联**: - 在配置的后期阶段(如生成代码前),通过工具或脚本将`Deferred Data Type`关联到具体的`Implementation Data Type`。 ```xml <TYPE-REFERENCE> <SHORT-NAME>DeferredTypeRef</SHORT-NAME> <TARGET-REF DEST="IMPLEMENTATION-DATA-TYPE">/ImplementationTypes/ActualType</TARGET-REF> </TYPE-REFERENCE> ``` 3. **工具支持**: - AUTOSAR配置工具(如DaVinci Developer)通常提供机制来处理`Deferred Data Type`,例如: - 在配置阶段标记为“待解析”。 - 在生成代码时自动替换为实际类型。 --- ### **与其他数据类型的对比** | 数据类型 | 解析时机 | 适用场景 | |------------------------|------------------|-----------------------------------| | **Application Data Type** | 配置阶段 | 描述软件组件间交换的数据语义。 | | **Implementation Data Type** | 配置阶段 | 定义数据的物理存储格式。 | | **Deferred Data Type** | 运行时/生成阶段 | 解决跨模块依赖或动态类型需求。 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值