web-dev-qa-db-ja.com

挿入の前(または??)に同じテーブルを更新するトリガーを作成する

トリガーの使用を開始したばかりで、行を挿入しているのと同じテーブルを更新するトリガーを作成する必要があります。

テーブル:

CREATE TABLE `city` (
  `city_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `city` varchar(50) NOT NULL,
  `country_id` smallint(5) unsigned DEFAULT '0',
  `country` varchar(150) DEFAULT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`city_id`),
  KEY `idx_fk_country_id` (`country_id`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=6009 DEFAULT CHARSET=utf8;

引き金:

DELIMITER $$
CREATE TRIGGER `populate_country_id` BEFORE INSERT ON `city`
FOR EACH ROW
BEGIN

IF NEW.country_id = 0

THEN
    UPDATE city
    INNER JOIN country B ON city.country = B.country
    SET NEW.country_id = B.country_id;

END IF;

END $$
DELIMITER ;

MySQLが返すだけです。このストアドファンクション/トリガーを呼び出したステートメントですでに使用されているため、ストアドファンクション/トリガーのテーブル 'city'を更新できません。

これを機能させる方法はありますか?

みんな、ありがとう!

1
Gilly
CREATE TRIGGER `populate_country_id` BEFORE INSERT ON `city`
FOR EACH ROW
SET NEW.country_id = (SELECT CASE WHEN NEW.country_id = 0
                                  THEN country_id 
                                  ELSE NEW.country_id END
                      FROM country 
                      WHERE country = NEW.country 
                      LIMIT 1); -- as a precaution

BEGIN-ENDとDELIMITERの再割り当ては過剰です。

PS。 NEW.country値がcountryテーブルにない場合、...挿入されたすべてのデータが間違っています。

0
Akina