加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 13:15:15 所属栏目:百科 来源:网络整理
导读:什么是防止具有2列的表(a(唯一)和b)的任何记录,其中列b等于列a中的任何值?这将用于这样的更正表, MR - MrPrf. - Prof.MRs - Mrs 我可以看到如何使用触发器和子查询来完成它,假设没有并发活动,但更多的声明性方法更可取. 这是应该预防的一个例子, Wing Commd
什么是防止具有2列的表(a(唯一)和b)的任何记录,其中列b等于列a中的任何值?这将用于这样的更正表,

MR   -> Mr
Prf. -> Prof.
MRs  -> Mrs

我可以看到如何使用触发器和子查询来完成它,假设没有并发活动,但更多的声明性方法更可取.

这是应该预防的一个例子,

Wing Commdr. -> Wing Cdr.
Wing Cdr.    -> Wing Commander

理想情况下,该解决方案适用于并发插入和更新.

解决方法

您可以使用物化视图来强制执行您的要求(使用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失败时,整个事务将回滚,您将丢失任何未经修改的更改(您无法“重试”).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读