oracle根据a列查出b列,如何防止B列与Oracle中的任何A列包含相同的值?

该博客介绍了如何通过创建物化视图和物化视图日志,在Oracle数据库中实现对特定列的唯一性约束,以确保在列A和列B的值上的数据序列化。在提交时,物化视图会检查唯一性,导致并发插入失败并回滚事务,从而避免数据冲突。
摘要由CSDN通过智能技术生成

您可以使用物化视图来强制您的需求(用10.2.0.1测试)。

SQL> CREATE TABLE t (a VARCHAR2(20) NOT NULL PRIMARY KEY,

2 b VARCHAR2(20) NOT NULL);

Table created

SQL> CREATE MATERIALIZED VIEW LOG ON t WITH (b), ROWID INCLUDING NEW VALUES;

Materialized view log created

SQL> CREATE MATERIALIZED VIEW mv

2 REFRESH FAST ON COMMIT

3 AS

4 SELECT 1 umarker, COUNT(*) c, count(a) cc, a val_col

5 FROM t

6 GROUP BY a

7 UNION ALL

8 SELECT 2 umarker, COUNT(*), COUNT(b), b

9 FROM t

10 GROUP BY b;

Materialized view created

SQL> CREATE UNIQUE INDEX idx ON mv (val_col);

Index created

唯一索引将确保在两列(在两行上)中不能有相同的值。

SQL> INSERT INTO t VALUES ('Wing Commdr.', 'Wing Cdr.');

1 row inserted

SQL> COMMIT;

Commit complete

SQL> INSERT INTO t VALUES ('Wing Cdr.', 'Wing Commander');

1 row inserted

SQL> COMMIT;

ORA-12008: erreur dans le chemin de régénération de la vue matérialisée

ORA-00001: violation de contrainte unique (VNZ.IDX)

SQL> INSERT INTO t VALUES ('X', 'Wing Commdr.');

1 row inserted

SQL> COMMIT;

ORA-12008: erreur dans le chemin de régénération de la vue matérialisée

ORA-00001: violation de contrainte unique (VNZ.IDX)

它将在提交期间序列化,但只在列A和列B的值上序列化(即:一般情况下,它不应阻止并发的不联合活动)。

只在提交时检查unicity,有些工具不希望提交失败,并且可能行为不适当。同样,当提交失败时,整个事务将回滚,并且您将丢失任何未提交的更改(不能“重试”)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值