How innodb tables are locked when ON INSERT trigger is processed?

前端 未结 2 1114
小鲜肉
小鲜肉 2021-02-04 20:47

I have two innodb tables:

articles

id     | title    | sum_votes
------------------------------
1      | art 1    | 5
2      | art 2    |          


        
2条回答
  •  情深已故
    2021-02-04 21:23

    try this:

    PHP: Star rating system concept?

    EDIT: changed schema to allow a user to vote for the same image many times:

    drop table if exists image;
    create table image
    (
    image_id int unsigned not null auto_increment primary key,
    caption varchar(255) not null,
    num_votes int unsigned not null default 0,
    total_score int unsigned not null default 0,
    rating decimal(8,2) not null default 0
    )
    engine = innodb;
    
    drop table if exists image_vote;
    create table image_vote
    (
    vote_id int unsigned not null auto_increment primary key,
    image_id int unsigned not null,
    user_id int unsigned not null,
    score tinyint unsigned not null default 0,
    key (image_id, user_id)
    )
    engine=innodb;
    
    delimiter #
    
    create trigger image_vote_after_ins_trig after insert on image_vote
    for each row
    begin
     update image set 
        num_votes = num_votes + 1,
        total_score = total_score + new.score,
        rating = total_score / num_votes  
     where 
        image_id = new.image_id;
    end#
    
    delimiter ;
    
    insert into image (caption) values ('image 1'),('image 2'), ('image 3');
    
    insert into image_vote (image_id, user_id, score) values
    (1,1,5),(1,2,4),(1,3,3),(1,4,2),(1,5,1),(1,5,2),(1,5,3),
    (2,1,2),(2,2,1),(2,3,4),(2,3,2),
    (3,1,4),(3,5,2);
    
    select * from image;
    select * from image_vote;
    

提交回复
热议问题