一表有字段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
分享到:
相关推荐
MySQL 中没有类似 Oracle 的 merge 语句,但是可以使用两种方法来实现类似的功能:INSERT INTO … ON DUPLICATE KEY UPDATE 和 REPLACE INTO。前者使用 INSERT 语句向表中插入记录,如果发现主键或唯一键冲突,则...
考虑使用非唯一索引支持唯一性约束条件 主动的确定使用循环嵌套、合并连接、散列连接,尽可能测试使用一种代价较小的连接方式。 如果需要在pl/sql 程序中使用动态sql,建议使用execute immediate 对于非常大的表,...
- 删除索引:删除普通索引和唯一索引使用 `ALTER TABLE 表名 DROP INDEX 索引名;`,删除主键索引使用 `ALTER TABLE 表名 DROP PRIMARY KEY;` 4. **联合索引** - 当多个列组合在一起创建的索引,被称为联合索引。...
- 唯一索引、全文索引、空间索引等不同类型的索引及其特点。 - 选择合适的索引类型来优化查询性能。 4. **索引语法** - 创建、修改和删除索引的SQL语句。 - 如何利用索引优化器进行索引设计。 5. **性能分析**...
- **5.1.19 求符号**:使用SIGN()函数判断数值的符号。 - **5.1.20 求整除余数**:使用MOD()函数计算两数相除的余数。 - **5.1.21 求自然对数**:使用LN()函数计算自然对数。 - **5.1.22 求以10为底的对数**:使用...
CONSTRAINT关键字用于设置约束条件,如NOT NULL、UNIQUE和CHECK等,以确保数据的完整性和准确性。主键(PRIMARY KEY)和外键(FOREIGN KEY)是关系型数据库中用来确保数据关系的重要概念。 为了提高查询效率,可以...
利用变量、条件判断、循环等控制结构可以使存储过程的功能更加强大。 **2.13 游标** 游标是一种特殊的指针,用于遍历结果集中的行。游标的使用可以逐行处理数据。 **2.14 存储过程错误处理** 通过捕获异常来处理...
此外,还需要考虑数据的约束条件,如主键、外键、唯一性约束等,以确保数据的一致性和完整性。 #### 流行的SQL开发工具 市场上有许多优秀的SQL开发工具,如: - **Oracle SQL Developer**:Oracle公司的官方工具...
- 通过这些结构可以实现逻辑判断和循环迭代等操作。 - **PL/SQL中动态执行SQL语句** - 动态SQL允许在运行时构建和执行SQL语句。 - 常用EXECUTE IMMEDIATE语句来实现。 - **PL/SQL的异常处理** - 异常处理用于...
- **不等值联合**:当联合条件不是简单的等于关系时,可以使用不等值联合。 - **外部联合与内部联合**:外部联合包括LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN,它们保留了某个表的所有行,即使没有匹配的行也显示...
- **主键设计**: 主键应具有唯一性和稳定性,通常使用自增整型字段或GUID。 - **外键设计**: 正确使用外键来维持数据一致性,但需要注意外键的级联更新或删除设置。 - **检查约束**: 定义合理的检查约束以确保数据的...
约束则确保数据的一致性和完整性,例如主键、外键、唯一性约束等。 #### SQL总览与开发工具 SQL不仅用于数据查询,还支持数据定义(如创建、修改、删除表)、数据操纵(如插入、更新、删除记录)和数据控制(如...