有点难度的问题
表中有一个字段 email , 约束位 unique
表中 有一条记录 aa.bb@cc.com
现在 要插入 另一个 email: aa_bb@cc.com
结果报错,提示 违反 约束, 因为 在oracl 插入 aa_bb@cc.com 会以类似下面的sql去查询是否已经有相同的email
select * from table where email like 'aa_bb@cc.com' ,在这条sql 中 _ 是个通配符,匹配任意一个字符,所以 会找到 aa.bb@cc.com, 产生了冲突
这个问题要怎么解决?
问题点数:100、回复次数:12Top
1 楼bzszp(SongZip)回复于 2006-02-15 10:47:23 得分 10
SQL> select 1 from dual where 'aa.bb@cc.com' like 'aa_bb@cc.com';
1
----------
1
SQL> select 1 from dual where 'aa.bb@cc.com' like replace('aa_bb@cc.com','_','\_') escape '\';
未选定行
SQL>Top
2 楼sbaz(万神渡劫)回复于 2006-02-15 10:52:08 得分 10
select * from table where email like 'aa[_]bb@cc.com'Top
3 楼Heister(▄︻┻┳═一)回复于 2006-02-15 10:55:15 得分 0
我的问题是 在 表里有 aa.bb@cc.com 这个用户时,怎么插入 aa_bb@cc.com这个用户而不报错
insert into table (email) values (aa_bb@cc.com) 这里面怎么用通配符?Top
4 楼Heister(▄︻┻┳═一)回复于 2006-02-15 10:56:32 得分 0
是 怎么用转义符Top
5 楼bzszp(SongZip)回复于 2006-02-15 11:04:22 得分 10
我觉得应该在约束里面处理Top
6 楼Heister(▄︻┻┳═一)回复于 2006-02-15 11:48:45 得分 0
怎么在约束里处理?Top
7 楼Heister(▄︻┻┳═一)回复于 2006-02-15 13:14:51 得分 0
顶哦Top
8 楼shicj(shicj)回复于 2006-02-15 14:04:19 得分 30
奇怪,我用下面的代码在oracle上试了一下,好像没问题呀。是不是你oracle数据库的版本比较老。
CREATE TABLE test5
(
USER_NAME VARCHAR2(60) NOT NULL
)
CREATE UNIQUE INDEX test5_idx ON test5(USER_NAME)
insert into test5 values('a.b')
insert into test5 values('a_b')
insert into test5 values('aa.bb.com')
insert into test5 values('aa_bb.com')
Top
9 楼lovelycat0512(努力学习)回复于 2006-02-15 14:37:34 得分 10
insert into TEST (EMAIL) values('aa'||chr(95)||'bb@cc.com')
chr(95) = '_'Top
10 楼lovelycat0512(努力学习)回复于 2006-02-15 14:40:37 得分 0
oracle有通配字符,也有转义字符,比如 ',''表示一个'
通配字符如果一定要用,可用ASCII码代替。Top
11 楼ThreadSharp(ThreadSharp V2006)回复于 2006-02-15 15:03:08 得分 30
你用的是什么版本的,
我在9I中试过了
insert into table (email) values ('aa_bb@cc.com');
可以通过
除了在WHERE后面的'_'代表通配符,其它地方可以当正常的字符使用Top
12 楼Heister(▄︻┻┳═一)回复于 2006-02-15 15:18:53 得分 0
原来 是数据库 加了个触发器,晕死,多谢大家了Top




