sql >> データベース >  >> RDS >> Mysql

Mysql再帰ストアドプロシージャ...制限0に達しました...max_sp_recursion_depth変数を変更できません

    モデルに適応できる非再帰的なソリューションは次のとおりです(http://pastie.org/1259300)

    drop table if exists product;
    
    create table product
    (
    prod_id smallint unsigned not null auto_increment primary key,
    name varchar(255) not null,
    parent_id smallint unsigned null,
    key (parent_id)
    )engine = innodb;
    
    
    insert into product (name, parent_id) values
    ('Products',null), 
       ('Systems & Bundles',1), 
       ('Components',1), 
          ('Processors',3), 
          ('Motherboards',3), 
            ('AMD',5), 
            ('Intel',5), 
               ('Intel LGA1366',7);
    
    
    delimiter ;
    
    drop procedure if exists product_hier;
    
    delimiter #
    
    create procedure product_hier
    (
    in p_prod_id smallint unsigned
    )
    begin
    
    declare v_done tinyint unsigned default 0;
    declare v_depth smallint unsigned default 0;
    
    create temporary table hier(
     parent_id smallint unsigned, 
     prod_id smallint unsigned, 
     depth smallint unsigned default 0
    )engine = memory;
    
    insert into hier select parent_id, prod_id, v_depth from product where prod_id = p_prod_id;
    
    /* http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html */
    
    create temporary table tmp engine=memory select * from hier;
    
    while not v_done do
    
        if exists( select 1 from product p inner join hier on p.parent_id = hier.prod_id and hier.depth = v_depth) then
    
            insert into hier 
                select p.parent_id, p.prod_id,  v_depth + 1 from product p 
                inner join tmp on p.parent_id = tmp.prod_id and tmp.depth = v_depth;
    
            set v_depth = v_depth + 1;          
    
            truncate table tmp;
            insert into tmp select * from hier where depth = v_depth;
    
        else
            set v_done = 1;
        end if;
    
    end while;
    
    select 
     p.prod_id,
     p.name as prod_name,
     b.prod_id as parent_prod_id,
     b.name as parent_prod_name,
     hier.depth
    from 
     hier
    inner join product p on hier.prod_id = p.prod_id
    inner join product b on hier.parent_id = b.prod_id
    order by
     hier.depth, hier.prod_id;
    
    drop temporary table if exists hier;
    drop temporary table if exists tmp;
    
    end #
    
    delimiter ;
    
    
    call product_hier(3);
    
    call product_hier(5);
    



    1. クラウド内のMySQL-AmazonRDSの長所と短所

    2. #1055-SELECTリストの式がGROUP BY句になく、集計されていない列が含まれています。これはsql_mode=only_full_group_byと互換性がありません。

    3. mysqlIDの自動増分が0から開始されない

    4. MySQL-選択時に行番号を取得