例如 T表有两个字段A,B
如果A的一个值是“1”,则“1”不能再次出现A,B字段中,如何保证?
如果A的一个值是“1”,则“1”不能再次出现A,B字段中,如何保证?
解决方案 »
- plsql中while循环怎么用
- oracle sys无法登录OEM
- Oracle 行级触发器共享数据问题
- 100 分。。错误的过程?谁帮我看看?
- 请问这个e.id (+)是什么意思
- shared_pool_size过大会对数据库性能产生影响吗?
- 请问查询longrow的字段 用selectblob语句可以吗
- 快来帮忙呀,出人命了!delphi中怎么调DBMS_OUTPUT.Get_LINE之类的函数呀?我没有分了,请包涵!!!
- 今天导出数据库的时候出现这个问题
- 求教,我是萌新,老师给了一个程序包的模板,但是有的地方我没懂
- 存储过程里面,要判断一个字符串是否包含指定的字符串及其index是多少,该怎么写?
- 提个查询的问题
add constraint CHECK_TEST
check (A!=B);
add constraint CHECK_TEST
check (A!=B);
而是A中的某个值在B中都没有,B中的某个值在A中都没有
alter table t add constraint ck_a_b check(a<>b);
alter table t add constraint uk_t_a unique(a);
A B
1 2
3 4
5 6
这时1,2,3,4,5,6都不能出现在A或B字段
UPDATE时,不能执行SELECT本表的操作,
也就是 SELECT COUNT(*) INTO NUM FROM T WHERE B=NEW.A; 不能执行,因为本表正处于修改状态
create or replace trigger tr_a before insert or update on table_a for each row
declare
num number;
begin
if inserting then
SELECT COUNT(*) INTO NUM FROM T WHERE B=NEW.A;
if num >0 then
return;
end if;
end if;
if updating then
SELECT COUNT(*) INTO NUM FROM T WHERE B=NEW.A;
if num >0 then
return;
end if;
end if;
end;
before insert or update on f
for each row
declare
num number;
begin
select count(*) into num from f
where a=:new.a or b=:new.a
or a=:new.b or b=:new.b
or :new.a=:new.b;
if num > 0 then
dbms_output.put_line('abcd');
raise_application_error(-20901, 'multiuse', false);
return;
end if;
end;
将就用。楼主可能还是考虑一下表的设计
Name Null? Type
----------------------------------------- -------- ----------------------------
A NUMBER
B NUMBER
还会有这样的需求,bt啊
为什么不把A,B字段合并为一个字段呢,实现唯一不就容易了。
如果实在有必要还可以增加一个对合并后的值的解析表不就都ok了
然后写触发器
create or replace trigger tr_a before insert or update on table_a for each row
declare
num number;
begin
if inserting then
insert into t_test(col) values(NEW.A);
insert into t_test(col) values(NEW.B);
end if;
if updating then
delete from t_test where col = old.a;
delete from t_test where col = old.b;
insert into t_test(col) values(NEW.A);
insert into t_test(col) values(NEW.B);
end if;
end;