0

私はこれらの2つのテーブルを持っています:

create table possiede (
soc1 integer not null,
soc2 integer not null,
primary key (soc1,soc2),
perc double
);

create table contr (
soc1 integer not null,
soc2 integer not null,
primary key(soc1, soc2)
);

一般的な SQL 構文でこれら 2 つのトリガーがあり、それらを MySQL 構文に変換する必要があります。

create trigger contrDir
after insert on possiede
for each row
when percent > 0.5 and (soc1,soc2) not in (select * from contr)
insert into contr values (soc1,soc2);

create trigger contrIndir
after insert on possiede
referencing new table as newTable
for each row
insert into possiede values
(select P.soc1, N.soc2, P.perc+N.perc
from newTable as N join possiede as P on N.soc1 = P.soc2);

これは私の最初の試みでしたが、「参照」キーワードでエラーが発生し (「構文エラー、予期しない IDENT_QUOTED、FOR_SYM が必要です」)、翻訳が正しいかどうかわかりません:

create trigger controllo
after insert on possiede
REFERENCING new table as newTable
for each row
begin
    insert into possiede (select P.soc1, N.soc2, P.perc+N.perc from
    newTable as N join possiede as P on N.soc1=P.soc2);
    if percent > 0.5 and (soc1,soc2) not in (select * from contr) then
    insert into contr values (soc1,soc2);
    end if;
end;

また、お気づきのように、MySQL の制約により、2 つのトリガーを 1 つに圧縮する必要がありました。誰か正しい訳を教えてくれませんか?

4

1 に答える 1

0

中括弧内に列名を入れて使用してくださいNEW_TABLE。さらに、IN CLAUSE within IF BLOCKに対して 2 つの列 (soc1 と soc2) をチェックしているため、 は正しくないと思いますselect * from...。以下のように更新されたクエリを使用してみてください。

  CREATE TRIGGER controllo
  AFTER INSERT on possiede
  REFERENCING NEW_TABLE AS newTable
  FOR EACH ROW
   BEGIN
      INSERT INTO possiede (soc1, soc2, perc) 
      SELECT P.soc1, N.soc2, P.perc+N.perc 
      FROM newTable AS N JOIN possiede AS P ON N.soc1=P.soc2;
      IF percent > 0.5 and soc1 not in (select soc1 from contr)
          and soc2 not in (select soc2 from contr)
        THEN
          INSERT INTO contr VALUES (soc1,soc2);
      END IF;
    END;
于 2012-11-05T17:45:42.407 に答える