2014-09-29 48 views
0

我已经手动编写并由此当在表campaign_categories插入新行会执行以下操作添加通过phpmyadmin,MySQL和触发我的表之一:如何成功添加一个触发

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 

然而,在执行我的应用程序的行动,将在该表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') 

我怎么能允许轨道,以允许该触发器在/任何触发应用程序吗?

+0

你确定列main_category_id存在于数据库中吗?即你运行rake db:在添加列之后进行迁移? – 2014-09-29 03:08:55

+0

这就是问题所在,数据库中没有名为'main_campaign_id'的列。在上面的触发器中,在有DECLARE的地方它们是变量,因此没有这样的表或列被命名为'main_campaign_id,main_category_id,inserted_category_id' ...等。我应该不使用变量,而是简单地进行子选择?确保所有引用的列和表存在于数据库中? – Sauron 2014-09-29 03:12:32

+0

我很抱歉..我不知道你的最后一个问题..你想要做什么? – 2014-09-29 03:16:54

回答

1

当你试图引用一个列名..它会引用数据库的存在,如果它没有找到你提到的列..它会抛出你在问题中提到的错误。检查数据库中是否存在数据库列,并确保在添加列后,您已经迁移了rake db:migrate

相关问题