Sql 在其他表上定义检查条件

Sql 在其他表上定义检查条件,sql,database-design,oracle11g,Sql,Database Design,Oracle11g,我有以下表格: 坦克桌 鱼型 吃 现在是这样的,有一个不同种类的鱼缸。我想把鱼放进鱼缸里。Eats指定哪两种物种相互吃。如果我们有这样的价值观 species1='a' species2='b' 这意味着物种“a”吃“b”,因此我们不能将它们放在同一个水箱中。现在我正在尝试创建一个名为fish的表,它应该 name species tanknum 在创建表的同时,我想在这里添加一个条件,即同一个鱼缸中的任何两条鱼都不应该相互吃掉。我想使用check约束实现这一点,我正在研究oraclesql

我有以下表格:

坦克桌 鱼型 吃 现在是这样的,有一个不同种类的鱼缸。我想把鱼放进鱼缸里。Eats指定哪两种物种相互吃。如果我们有这样的价值观

species1='a' species2='b'
这意味着物种“a”吃“b”,因此我们不能将它们放在同一个水箱中。现在我正在尝试创建一个名为fish的表,它应该

name
species
tanknum

在创建表的同时,我想在这里添加一个条件,即同一个鱼缸中的任何两条鱼都不应该相互吃掉。我想使用check约束实现这一点,我正在研究oraclesql。需要一些帮助。

触发器将是一个很好的解决方案

    create trigger prevent 
    on fish 
    for insert 
    as 
begin
    if ( CASE when inserted.species IN (SELECT DISTINCT (species2) FROM fish f JOIN eats e ON f.species= e.species1) THEN 1 ELSE 0 END)

    /* Cancel the insert and print a message.*/

        rollback transaction; 
        print "No fish eating allowed!." ;

    /* Otherwise, allow it. */
    else
      print "Added!";
    end if;
end;

伙计,快去看看这个!!!!有任何澄清让我知道

 create or replace
TRIGGER check_fish before
INSERT ON fish_in_tank FOR EACH row DECLARE

Type rec_2 IS TABLE OF fish_in_tank%rowtype;
fish_dup rec_2;
no_insert EXCEPTION;
BEGIN

SELECT name,
SPECIES,
tanknum bulk collect
INTO fish_dup
FROM fish_in_tank
WHERE SPECIES IN
(SELECT case when species1=:new.species then species2 when species2=:new.species then species1 end FROM Eats );

dbms_output.put_line(fish_dup(1).name);
FOR i IN fish_dup.first..fish_dup.last
LOOP
IF (:new.tanknum=fish_dup(i).tanknum) THEN
raise no_insert;
END IF;
END LOOP;
EXCEPTION
WHEN no_insert THEN

raise_application_error(-20000,'Cannot insert');
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Successful');
END;

关系方式是使用数据库约束;SQL标准将要求断言。但我认为还没有人实现这两个功能。所以,触发器。@Wawrzyniec Sz:如何在普通触发器中回滚?我想使用check约束来实现这一点。有没有可能的解决方案?哦..好主意,伙计,即使我第一次这样尝试..等等,让你知道我不会为此使用触发器--应该在应用程序中实现的是应用程序逻辑。
name
species
tanknum
    create trigger prevent 
    on fish 
    for insert 
    as 
begin
    if ( CASE when inserted.species IN (SELECT DISTINCT (species2) FROM fish f JOIN eats e ON f.species= e.species1) THEN 1 ELSE 0 END)

    /* Cancel the insert and print a message.*/

        rollback transaction; 
        print "No fish eating allowed!." ;

    /* Otherwise, allow it. */
    else
      print "Added!";
    end if;
end;
 create or replace
TRIGGER check_fish before
INSERT ON fish_in_tank FOR EACH row DECLARE

Type rec_2 IS TABLE OF fish_in_tank%rowtype;
fish_dup rec_2;
no_insert EXCEPTION;
BEGIN

SELECT name,
SPECIES,
tanknum bulk collect
INTO fish_dup
FROM fish_in_tank
WHERE SPECIES IN
(SELECT case when species1=:new.species then species2 when species2=:new.species then species1 end FROM Eats );

dbms_output.put_line(fish_dup(1).name);
FOR i IN fish_dup.first..fish_dup.last
LOOP
IF (:new.tanknum=fish_dup(i).tanknum) THEN
raise no_insert;
END IF;
END LOOP;
EXCEPTION
WHEN no_insert THEN

raise_application_error(-20000,'Cannot insert');
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Successful');
END;