MYSQL语法错误,while_sym时意外,应为_输入的结尾或“;”

MYSQL语法错误,while_sym时意外,应为_输入的结尾或“;”,mysql,Mysql,我正在尝试创建一个归档事件,我想到的是这样的: SET @Date = NULL; SET @SEDOL = NULL; CREATE EVENT IF NOT EXISTS Archive_Event ON SCHEDULE EVERY 1 DAY DO SELECT @Date = Date,@SEDOL = SEDOL from daily.analytics where Date = (SELECT MIN(Date) from daily.ana

我正在尝试创建一个归档事件,我想到的是这样的:

SET @Date = NULL;
SET @SEDOL = NULL;
CREATE EVENT IF NOT EXISTS Archive_Event
ON SCHEDULE EVERY 1 DAY
DO
SELECT @Date = Date,@SEDOL = SEDOL
from daily.analytics
where   Date =  (SELECT MIN(Date)
                 from daily.analytics 
                 WHERE Date < date_sub(NOW(), INTERVAL 21 DAY))
order by SEDOL desc limit 1

WHILE @date is not null
begin
    begin transaction
    -- Adds old line to archive
    insert into daily.Archive_analytics
        select * from daily.analytics where Date = @Date AND SEDOL = @SEDOL
    -- Deletes old line from main table
    delete from daily.analytics where Date = @Date AND SEDOL = @SEDOL
    commit transaction
    -- Find the next greater minimum value
    SELECT @Date = Date,@SEDOL = SEDOL
    from daily.analytics
    where   Date =  (SELECT MIN(Date)
                     from daily.analytics 
                     WHERE Date < date_sub(NOW(), INTERVAL 21 DAY))
     order by SEDOL desc
     limit 1
END WHILE
END
SET @Date = NULL;
SET @SEDOL = NULL;

delimiter |
CREATE EVENT IF NOT EXISTS daily.Archive_Event_HOUR
ON SCHEDULE EVERY 1 DAY
DO
    begin
    SELECT @Date = Date,@SEDOL = SEDOL
    from daily.analytics
    where   Date =  (SELECT MIN(Date)
                     from daily.analytics 
                     WHERE Date < date_sub(NOW(), INTERVAL 21 DAY))
    order by SEDOL desc limit 1;

    WHILE @Date is not null DO
        start transaction;
        -- Adds old line to archive
        insert into daily.Archive_analytics
            select * from daily.analytics where Date = @Date AND SEDOL = @SEDOL;
        -- Deletes old line from main table
        delete from daily.analytics where Date = @Date AND SEDOL = @SEDOL;
        commit;
        -- Find the next greater minimum value
        SELECT @Date = Date,@SEDOL = SEDOL
        from daily.analytics
        where   Date =  (SELECT MIN(Date)
                         from daily.analytics 
                         WHERE Date < date_sub(NOW(), INTERVAL 21 DAY))
         order by SEDOL desc
         limit 1;
    END WHILE;
END|
delimiter ;
搜索web这似乎或多或少是正确的,但是我的WHILE语句出现语法错误,WHILE_sym意外,应为输入的结尾或“;”我不太清楚为什么


非常感谢您的帮助。

因此,原来问题是由于分隔符和代码中有多个块造成的。没有语法错误的版本如下所示:

SET @Date = NULL;
SET @SEDOL = NULL;
CREATE EVENT IF NOT EXISTS Archive_Event
ON SCHEDULE EVERY 1 DAY
DO
SELECT @Date = Date,@SEDOL = SEDOL
from daily.analytics
where   Date =  (SELECT MIN(Date)
                 from daily.analytics 
                 WHERE Date < date_sub(NOW(), INTERVAL 21 DAY))
order by SEDOL desc limit 1

WHILE @date is not null
begin
    begin transaction
    -- Adds old line to archive
    insert into daily.Archive_analytics
        select * from daily.analytics where Date = @Date AND SEDOL = @SEDOL
    -- Deletes old line from main table
    delete from daily.analytics where Date = @Date AND SEDOL = @SEDOL
    commit transaction
    -- Find the next greater minimum value
    SELECT @Date = Date,@SEDOL = SEDOL
    from daily.analytics
    where   Date =  (SELECT MIN(Date)
                     from daily.analytics 
                     WHERE Date < date_sub(NOW(), INTERVAL 21 DAY))
     order by SEDOL desc
     limit 1
END WHILE
END
SET @Date = NULL;
SET @SEDOL = NULL;

delimiter |
CREATE EVENT IF NOT EXISTS daily.Archive_Event_HOUR
ON SCHEDULE EVERY 1 DAY
DO
    begin
    SELECT @Date = Date,@SEDOL = SEDOL
    from daily.analytics
    where   Date =  (SELECT MIN(Date)
                     from daily.analytics 
                     WHERE Date < date_sub(NOW(), INTERVAL 21 DAY))
    order by SEDOL desc limit 1;

    WHILE @Date is not null DO
        start transaction;
        -- Adds old line to archive
        insert into daily.Archive_analytics
            select * from daily.analytics where Date = @Date AND SEDOL = @SEDOL;
        -- Deletes old line from main table
        delete from daily.analytics where Date = @Date AND SEDOL = @SEDOL;
        commit;
        -- Find the next greater minimum value
        SELECT @Date = Date,@SEDOL = SEDOL
        from daily.analytics
        where   Date =  (SELECT MIN(Date)
                         from daily.analytics 
                         WHERE Date < date_sub(NOW(), INTERVAL 21 DAY))
         order by SEDOL desc
         limit 1;
    END WHILE;
END|
delimiter ;

while之后的begin结束在哪里?我想你们应该在beginDo的while循环中有一个结束,你们是说begin事务吗?