0

データベースで 1 つのレコードのみを許可するトリガーを作成しようとしているため、以前のレコードはすべて削除されます。しかし、現在は、すぐに削除されるため、何も挿入できません。

DELIMITER $$
CREATE TRIGGER test_insert 
BEFORE INSERT ON test
FOR EACH ROW BEGIN
DELETE FROM test WHERE id = NEW.id - 1;
END$$

以前に (または以前に) 挿入されたすべてのレコードを削除するにはどうすればよいですか?

4

2 に答える 2

2

「しかし、現在、それは即座に削除されるため、何も挿入できません。」

実際、INSERT を実行すると、トリガーの実行で例外がスローされるはずです。

Error Code: 1442
Can't update table 'test' in stored function/trigger because it is
  already used by statement which invoked this stored function/trigger.

(新しいバージョンの MySQL で何かが根本的に異なる場合を除きます。)


実行したい操作 (つまり、挿入先と同じテーブルから行を削除すること) は、MySQL トリガーでは実行できません。

UNIQUE KEY と BEFORE INSERT トリガーを組み合わせて使用​​すると、複数の行が挿入されるのを防ぐことができます。BEFORE INSERT トリガーは、一意のキーを持つ列の値を静的な値に設定でき、INSERT ステートメントは重複キー (「重複エントリ」) 例外をスローします。

次に、INSERT ... ON DUPLICATE KEY UPDATE ...ステートメントを使用して、一意の ID 以外の列の値を更新できます。

CREATE TRIGGER `test_insert` BEFORE INSERT ON test
FOR EACH ROW BEGIN
   SET NEW.id := 1;
END

ALTER TABLE test ADD UNIQUE KEY (id);

INSERT INTO test (somecol) VALUES ('someval')
ON DUPLICATE KEY UPDATE somecol = VALUES(somecol) ;
于 2013-01-11T16:06:49.477 に答える
0

そのためには、まず、すべてを削除して挿入する値を見つける必要があります。このように、トリガーは必要ありません。以前のすべてのケースを削除してから、新しい行を追加するだけです。何らかの理由でコードから説明できない場合を除いて、トリガーが必要になる場合を除き、ループ内の単純なソリューションは次のように機能します。

$query = mysql_query("DELETE FROM test WHERE id = NEW.id -1");
$new_id = $new.id -1;
$query2 = mysql_query("INSERT INTO test VALUES('$new_id','$var1','$var2'));
于 2013-01-11T15:41:06.287 に答える