如何防止列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失败时,整个事务将回滚,您将丢失任何未经修改的更改(您无法“重试”). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |