Mysql 如何成功添加触发器

Mysql 如何成功添加触发器,mysql,ruby-on-rails,triggers,Mysql,Ruby On Rails,Triggers,我已经通过PHPMyAdmin、MySQL手动编写并添加了一个触发器到我的一个表中,在表campaign_categories中插入新行时,将执行以下操作: BEGIN DECLARE `main_campaign_id` INT; DECLARE `inserted_category_id` INT; DECLARE `new_category_row_id` INT; SET `new_category_row_id` =

我已经通过PHPMyAdmin、MySQL手动编写并添加了一个触发器到我的一个表中,在表campaign_categories中插入新行时,将执行以下操作:

BEGIN
    DECLARE `main_campaign_id`       INT;
    DECLARE `inserted_category_id`   INT;
    DECLARE `new_category_row_id`    INT;

    SET `new_category_row_id` =
        (SELECT max(`id`) 
         FROM `campaign_categories`);

    SET `main_campaign_id` = 
        (SELECT `campaign_id` 
        FROM `campaign_categories`
        WHERE `id` = `new_category_row_id`);

    SET `inserted_category_id` = 
        (SELECT `category_id` 
        FROM `campaign_categories`
        WHERE `id` = `new_category_row_id`);


    INSERT INTO `campaign_category_metro_bids`(
         `campaign_id`
        ,`category_id`
        ,`metro_id`)
    SELECT 
         `main_campaign_id` as 'campaign_id'
        ,`main_category_id` as 'category_id'
        ,m.`metro_id`       as 'metro_id'
    FROM `campaign_categories`
    CROSS JOIN `campaign_metros` m
        WHERE m.`campaign_id` = `main_campaign_id`;
END
但是,在my app中执行将在表campaign_categories中插入新行的操作时,应用程序返回以下错误消息:

ActiveRecord::StatementInvalid in CampaignsController#update
Mysql2::Error: Unknown column 'main_category_id' in 'field list': INSERT INTO `campaign_categories` (`campaign_id`, `category_id`, `created_at`, `updated_at`) VALUES (21, 1, '2014-09-28 00:01:40', '2014-09-28 00:01:40')

如何允许rails允许此触发器/应用程序中的任何触发器?

当您尝试引用列名时。它将引用数据库以确定其存在,如果它找不到您提到的列。它将抛出您在问题中提到的错误。检查数据库中是否存在数据库列,并确保添加列后已迁移
rake db:migrate

是否确保数据库中存在列main\u category\u id?i、 e.添加列后是否运行了rake db:migrate?这就是问题所在,数据库中没有名为
main\u campaign\u id
的列。在上面的触发器中,如果存在声明,则它们是变量,因此没有将此类表或列命名为
main\u campaign\u id、main\u category\u id、inserted\u category\u id
…等。我应该不使用变量,而只是子选择吗?确保所有引用的列和表都存在于数据库中?很抱歉..我无法回答你的最后一个问题..你到底想做什么?我是问rails是否不喜欢我的触发器,因为数据库中没有其他地方出现变量?即插入的类别id等。只使用数据库中已经存在的列和表名创建触发器是否更好?例如,
campaign\u categories
表和
campaign\u id
存在于数据库中。或者rails只是不喜欢PHPMyAdmin中的触发器吗?没错..当你试图引用一个列名..它会引用数据库,如果它找不到你提到的列..它会抛出错误。首先,为什么不能用rails的方式创建触发器?