0

こんにちは、mysql を学習しようとしていますが、テーブル内の列に対する更新操作の後に動作するトリガーを定義した後、正しく動作しません。この列を更新するたびに、行を即座に削除する必要があります(この列の型はDATEで、最初にNULLに宣言されています)。これは私のテーブルの構造です

Create Table Projects (

    pro_ID INT NOT NULL,
    pro_Name VARCHAR(150) NOT NULL,
    comp_date_info DATE DEFAULT NULL,

    PRIMARY KEY(pro_ID)
);

ストアドプロシージャでタプルを追加しようとしています

DELIMITER //
CREATE PROCEDURE insert_into_Projects ( IN projectID INT, IN projectName VARCHAR(50) )
BEGIN

INSERT INTO homework.Projects values (projectID, projectName,NULL);

END //
DELIMITER ;

これは、Projects テーブルに新しいタプルを追加するための呼び出しステートメントです。

call insert_into_Projects(111,'Project Mayhem');

これまでのところ、お気づきのように、次のようなタプルがあります

   pro_ID   pro_Name         comp_date_info

1) 111      Project Mayhem   NULL

これがトリガーの実装です

DELIMITER //
CREATE TRIGGER after_Projects_update
AFTER UPDATE ON homework.Projects
FOR EACH ROW
BEGIN

delete from homework.Projects
where comp_date_info != NULL;

END //
DELIMITER ;

最後に、このタプルの comp_date_info を適切な日付値に更新するたびに、トリガーを削除する必要があります。

update homework.Projects
set comp_date_info = '1989-04-05'
where pro_ID = 113;

しかし、私は言うエラーに直面しています

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

お役に立てれば幸いです。また、ご返信いただきありがとうございます。

4

1 に答える 1

0

トリガーを呼び出した行を削除することはできません (明らかに)。

代わりに、列を として定義しますNOT NULL。これにより、アプリケーション コードが状況に対処するようになります。この場合は、列を null で更新するのではなく、行を削除します。

もう 1 つのオプションは、新しい値を渡すストアド プロシージャにすべてのロジックをバンドルすることです。ストアド プロシージャは、入力に基づいて更新または削除できます。

于 2013-01-09T21:27:23.630 に答える