0

mysql 5.6 を使用しています。私は2つのテーブルを持っています。1 つはハッシュのホワイトリストです。別のテーブルに新しい行を挿入するとき、最初に挿入ステートメントのハッシュをホワイトリストと比較したいと考えています。ホワイトリストにある場合は、挿入を行いたくありません (後で掘り下げるデータが少なくなります)。挿入は別のプログラムから生成され、SQL ステートメントを含むテキスト ファイルです。

私はトリガーで遊んでいますが、ほとんど機能しています:

CREATE TRIGGER `Filelist` BEFORE INSERT ON `filelist`
FOR EACH ROW BEGIN IF(
SELECT count( md5hash ) FROM whitelist WHERE md5hash = new.hash ) >0
THEN
  SIGNAL SQLSTATE '45000'
  SET MESSAGE_TEXT = 'Can not have duplicates';

END IF ;

END 

しかし、問題があります。エラーをスローするシグナルはインポートを停止します。インポート全体を停止するのではなく、その行をスキップしたい。

一部の検索では、インポートをサイレントにスキップする方法が見つかりませんでした。

私の次のアイデアは、複製テーブル定義を作成し、挿入をその複製テーブルにリダイレクトすることでした。しかし、古いものと新しいものはテーブル名には当てはまらないようです。

テーブルに無視列を追加し、インポート後にその列に基づいて一括削除を行う以外に、目標を達成する方法はありますか? 私もこれに問題があります[無視はtinyint(1)です]:

DELIMITER $$

CREATE TRIGGER whitelisted
BEFORE INSERT ON filelist
FOR EACH ROW BEGIN
  IF (select count(md5hash) from whitelist where md5hash=new.hash) > 0 THEN
  SET Ignore = true;
  END IF;
END$$
/* This is now "END$$" not "END;" */

/* Reset the delimiter back to ";" */
DELIMITER ;

#1064 - You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near ') THEN SET Ignore = true;
END IF; END' at line 4

助言がありますか?私も試してみました

SET Ignore = 1;
SET Ignore = '1';
SET new.Ignore = {all of the above};
4

2 に答える 2

0

この仕様に従っているかどうかはわかりません。

私は2つのテーブルを持っています。1 つはハッシュのホワイトリストです。別のテーブルに新しい行を挿入するとき、最初に挿入ステートメントのハッシュをホワイトリストと比較したいと考えています。ホワイトリストにある場合は、挿入したくありません

私の最初の試みは次のようになります:

INSERT INTO filelist (filename, hash)
SELECT "myfile", "ABCD" FROM DUAL
WHERE NOT EXISTS(
    SELECT md5hash FROM whitelist where md5hash = "ABCD"    
);

要件に欠落している詳細がない限り、これにトリガーはまったく必要ないと思います。

于 2013-10-17T18:18:59.900 に答える