如何在oracle中的多个表中应用唯一约束?

时间:2016-11-19 12:23:02

标签: sql oracle constraints

我有3张表显示在这张表中:
表A

 A(
        code1
        .
        .
        .
    )

表B

B(
    code2
    .
    .
    .
)

表C

C(
    code3
    .
    .
    .
)

我想在这个表的code1,code2,code3之间保持唯一 我如何接受oracle的目标?
关于这个问题,是否存在任何oracle语法?

3 个答案:

答案 0 :(得分:1)

基于物化视图。

P.S。
代码未经过验证 我目前只能访问oracle XE 11gR2,因此我无法使用物化视图日志功能。

create table A   (code int primary key);
create table B   (code int primary key);
create table C   (code int primary key);

create materialized view log on a with primary key;
create materialized view log on b with primary key;
create materialized view log on c with primary key;

create materialized view ABC_MV
refresh fast
as
          select code from A
union all select code from B
union all select code from C
;

alter table ABC_MV add unique (code);

答案 1 :(得分:0)

你可以用触发器做到这一点。

CREATE OR REPLACE TRIGGER table1_check
BEFORE INSERT OR UPDATE ON table1
FOR EACH ROW
BEGIN
    IF EXISTS (
        SELECT attribute FROM table2
        WHERE attribute = :NEW.attribute
    ) THEN
        RAISE_APPLICATION_ERROR(-20001,
        'Already exist in table2');
    END IF;
END;
/

您可以修改它以检查更多表格。

答案 2 :(得分:-1)

使用第4张表

create table ABC (tab char(1) not null ,code int primary key, unique (tab,code));

create table A   (tab char(1) as ('A') virtual not null,code int primary key,foreign key (tab,code) references ABC(tab,code));
create table B   (tab char(1) as ('B') virtual not null,code int primary key,foreign key (tab,code) references ABC(tab,code));
create table C   (tab char(1) as ('C') virtual not null,code int primary key,foreign key (tab,code) references ABC(tab,code));
insert into ABC (tab,code) values ('A',1);
insert into A (code) values (1);
insert into A (code) values (1);
  

[代码:1,SQL状态:23000] ORA-00001:违反了唯一约束(SYS.SYS_C0012834)

insert into B (code) values (1);
  

[代码:2291,SQL状态:23000] ORA-02291:完整性约束   (SYS.SYS_C0012839)违反了 - 未找到父密钥