oracle相同列,如何防止列b包含与Oracle中任何列a相同的值?

您可以使用物化视图来强制执行您的要求(使用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的值(即:通常它不应该阻止并发的不相交活动).

只会在COMMIT时检查unicity,并且某些工具不会指望提交失败并且可能表现不当.此外,当COMMIT失败时,整个事务将回滚,您将丢失任何未经修改的更改(您无法“重试”).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值