2

次のようなテーブルがあります。

タンクテーブル

CREATE TABLE fishtank(
tanknum number(8),
temperature number(6,2),
capacity number(10),
primary key(tanknum));

Name        Null     Type        
----------- -------- ----------- 
TANKNUM     NOT NULL NUMBER(8)   
TEMPERATURE          NUMBER(6,2) 
CAPACITY             NUMBER(10)  

魚の種類

CREATE TABLE type(
species varchar2(20),
mintemp number(6,2),
maxtemp number(6,2),
primary key(species));


Name    Null     Type         
------- -------- ------------ 
SPECIES NOT NULL VARCHAR2(20) 
MINTEMP          NUMBER(6,2)  
MAXTEMP          NUMBER(6,2)  

食べる

CREATE TABLE eats(
species1 varchar2(20),
species2 varchar2(20),
primary key(species1, species 2),
foreign key(species1) references type,
foreign key(species2) references type);

Name     Null     Type         
-------- -------- ------------ 
SPECIES1 NOT NULL VARCHAR2(20) 
SPECIES2 NOT NULL VARCHAR2(20) 

今はこんな感じで種の違う水槽があります。水槽に魚を入れたいです。Eats は、どの 2 つの種が互いに食べ合うかを指定します。次のような食事に価値がある場合

species1='a' species2='b'

これは、種「a」が「b」を食べることを意味するため、両方を同じ水槽に入れることはできません。今、私はfishというテーブルを作成しようとしています

name
species
tanknum

テーブルを作成する際に、同じタンク内の 2 匹の魚が互いに食べてはならないという条件をここに追加したいと思います。チェック制約を使用してこれを実装したいのですが、Oracle SQLに取り組んでいます。助けが要る。

4

2 に答える 2

1

トリガーは良い解決策です

    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;
于 2013-03-02T16:43:25.923 に答える
0

おいおいこれをチェックしてください!!!!説明があれば教えてください!!!!

 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;
于 2013-03-04T12:16:28.887 に答える