`
mikixiyou
  • 浏览: 1098010 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:352838
社区版块
存档分类
最新评论

函数索引和唯一索引的联合使用实现具条件判断功能的唯一约束

阅读更多
 一表有字段A和B,若在B为100时(A,B)可以重复,其他时候(A,B)不可重复,如何实现?

SQL> select * from tt1;

A                             B

a                             1

b                             1

c                             1

a                           100

a                           100

 

实现方法

开始想到建立一触发器,在插入之前先判断本表中有没有相同记录,如何是B字段是100,则可以插入,如果不是,则退出。

但考虑后,认为在判断是否重复时,不能保证另外的会话也在做相同判断。这样的逻辑会导致多条相同记录插入。

这里使用一个技巧,使用具有函数索引和唯一索引联合实现该需求。

方式如下:

create table tt1(a varchar2(10),b number);

create Unique index ind_ab on tt1(decode(b,100,null,a),decode(b,100,null,b));

 

如果插入条件值重复,则会报错ORA-00001: unique constraint (SYS.IND_AB) violated

测试过程

SQL> create table tt1(a varchar2(10),b number);

Table created.

SQL> create Unique index ind_ab on tt1(decode(b,100,null,a),decode(b,100,null,b));

Index created.

SQL> insert into tt1 values('a',1);

insert into tt1 values('b',1);

1 row created.

SQL>

1 row created.

SQL> insert into tt1 values('c',1);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into tt1 values('a',100);

commit;

1 row created.

SQL>

Commit complete.

SQL> insert into tt1 values('a',100);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from tt1;

A                             B

-------------------- ----------

a                             1

 

b                             1

 

c                             1

 

a                           100

 

a                           100

SQL> insert into tt1 values('a',1);

commit;insert into tt1 values('a',1)

*

ERROR at line 1:

ORA-00001: unique constraint (SYS.IND_AB) violated

SQL>

 

墙外:http://mikixiyou.blogspot.com/2012/04/blog-post_10.html

0
0
分享到:
评论

相关推荐

    mysql面试题,涉及MySQL基础、MySQL索引、MySQL语句 MySQL进阶等方面,适用于初、中级开发人员

    MySQL 中没有类似 Oracle 的 merge 语句,但是可以使用两种方法来实现类似的功能:INSERT INTO … ON DUPLICATE KEY UPDATE 和 REPLACE INTO。前者使用 INSERT 语句向表中插入记录,如果发现主键或唯一键冲突,则...

    SQL普查优化信息汇总

    考虑使用非唯一索引支持唯一性约束条件 主动的确定使用循环嵌套、合并连接、散列连接,尽可能测试使用一种代价较小的连接方式。 如果需要在pl/sql 程序中使用动态sql,建议使用execute immediate 对于非常大的表,...

    MySQL索引的基本语法

    - 删除索引:删除普通索引和唯一索引使用 `ALTER TABLE 表名 DROP INDEX 索引名;`,删除主键索引使用 `ALTER TABLE 表名 DROP PRIMARY KEY;` 4. **联合索引** - 当多个列组合在一起创建的索引,被称为联合索引。...

    Mysql 进阶修行学习

    - 唯一索引、全文索引、空间索引等不同类型的索引及其特点。 - 选择合适的索引类型来优化查询性能。 4. **索引语法** - 创建、修改和删除索引的SQL语句。 - 如何利用索引优化器进行索引设计。 5. **性能分析**...

    程序员的SQL金典.pdf 高清 下载

    - **5.1.19 求符号**:使用SIGN()函数判断数值的符号。 - **5.1.20 求整除余数**:使用MOD()函数计算两数相除的余数。 - **5.1.21 求自然对数**:使用LN()函数计算自然对数。 - **5.1.22 求以10为底的对数**:使用...

    SQL增删改查等操作多表连接实例

    CONSTRAINT关键字用于设置约束条件,如NOT NULL、UNIQUE和CHECK等,以确保数据的完整性和准确性。主键(PRIMARY KEY)和外键(FOREIGN KEY)是关系型数据库中用来确保数据关系的重要概念。 为了提高查询效率,可以...

    sql入门经典 pdf文档

    利用变量、条件判断、循环等控制结构可以使存储过程的功能更加强大。 **2.13 游标** 游标是一种特殊的指针,用于遍历结果集中的行。游标的使用可以逐行处理数据。 **2.14 存储过程错误处理** 通过捕获异常来处理...

    SQL

    此外,还需要考虑数据的约束条件,如主键、外键、唯一性约束等,以确保数据的一致性和完整性。 #### 流行的SQL开发工具 市场上有许多优秀的SQL开发工具,如: - **Oracle SQL Developer**:Oracle公司的官方工具...

    Oracle数据库经典学习教程

    - 通过这些结构可以实现逻辑判断和循环迭代等操作。 - **PL/SQL中动态执行SQL语句** - 动态SQL允许在运行时构建和执行SQL语句。 - 常用EXECUTE IMMEDIATE语句来实现。 - **PL/SQL的异常处理** - 异常处理用于...

    SQL21自学通.pdf

    - **不等值联合**:当联合条件不是简单的等于关系时,可以使用不等值联合。 - **外部联合与内部联合**:外部联合包括LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN,它们保留了某个表的所有行,即使没有匹配的行也显示...

    数据库设计和编码规范.docx

    - **主键设计**: 主键应具有唯一性和稳定性,通常使用自增整型字段或GUID。 - **外键设计**: 正确使用外键来维持数据一致性,但需要注意外键的级联更新或删除设置。 - **检查约束**: 定义合理的检查约束以确保数据的...

    sql 学习宝典

    约束则确保数据的一致性和完整性,例如主键、外键、唯一性约束等。 #### SQL总览与开发工具 SQL不仅用于数据查询,还支持数据定义(如创建、修改、删除表)、数据操纵(如插入、更新、删除记录)和数据控制(如...

Global site tag (gtag.js) - Google Analytics