トリガーの使用を開始したばかりで、行を挿入しているのと同じテーブルを更新するトリガーを作成する必要があります。
テーブル:
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'を更新できません。
これを機能させる方法はありますか?
みんな、ありがとう!
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
テーブルにない場合、...挿入されたすべてのデータが間違っています。