0

テーブルのトリガーを作成したいと思いますtable_master

のテーブル スキーマtable_masterは単純です。

master_id       INT(11)       AUTO_INCREMENT, PRIMARY, NOT NULL
title           VARCHAR(50)   NOT NULL

そして、ここに別の関係テーブルがありますrel_master_another_tbl

master_id       INT(11)       PRIMARY, NOT NULL
another_id      INT(11)       PRIMARY, NOT NULL

私が達成したいのは、 でDELETEクエリが発行されたときに、で が使用されているtable_masterかどうかをトリガーがチェックすることです。更新:はいの場合、クエリをロールバック/キャンセルします。master_idrel_master_another_tblDELETE

どうすればこれを達成できますか?

CREATE TRIGGER check_before_delete BEFORE DELETE ON table_master
// what should I put here?
END;
4

2 に答える 2

1

ON DELETE RESTRICT実装しようとしている動作はデータベースに既に存在し、トリガーを介して利用できます。これを利用するためにテーブルを定義する例を以下に示します。

CREATE TABLE `master` (
    `master_id` int(11) NOT NULL AUTO_INCREMENT,
    `title` varchar(50) DEFAULT NULL,
    PRIMARY KEY (`master_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `rel_master_another_tbl` (
    `master_id` int(11) NOT NULL,
    `another_id` int(11) NOT NULL,
    KEY `i_master_id` (`master_id`),
    FOREIGN KEY `fk_rel_master_another_tbl_master` (`master_id`)
        REFERENCES `master` (`id`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

RESTRICTこのコンテキストでは、masters id 列を参照してmasterいる対応する行がテーブルにある場合、テーブルから行を削除しようとすると失敗することを意味します。rel_master_another_tblまた、外部キーのとトリガーRESTRICTの両方のデフォルト オプションであるため、以下に示すように外部キーを実際に定義しても、同じように機能することに注意してください。ON DELETEON UPDATE

FOREIGN KEY `fk_rel_master_another_tbl_master` (`master_id`)
    REFERENCES `master` (`id`)

詳細については、外部キー制約に関する MySQL のドキュメントを参照してください。

于 2012-12-20T07:44:21.903 に答える
0

この ID が別のテーブルに存在するかどうかを確認したい場合は、次の方法で行うことができます。

DELIMITER $$

CREATE TRIGGER check_before_delete BEFORE DELETE ON table_master
FOR EACH ROW
BEGIN

DECLARE has_row TINYINT;

SELECT 1
INTO has_row
FROM rel_master_another_tbl
WHERE master_id = OLD.master_id;

IF has_row IS NOT NULL THEN
// PUT YOUR CODE HERE
END IF;

END$$

ON DELETE RESTRICTただし、テーブル間のキー制約の設定とトリガーの使用に関するPerceptionのコメントを確認してください。これが問題の適切な解決策になる可能性があります。

于 2012-12-20T06:50:04.523 に答える