【问题标题】:Drop procedure if exists in mysql如果 mysql 中存在则删除过程
【发布时间】:2017-10-20 19:43:56
【问题描述】:

您好,我正在尝试创建一个 mysql 脚本,我可以在需要更新数据库时运行该脚本。该脚本创建一个表,然后执行一些存储过程。

DELIMITER $$

CREATE TABLE IF NOT EXISTS tbl_name (
    col1 bigint(20) NOT NULL AUTO_INCREMENT,
    col2  varchar(255) NOT NULL,
    col3 varchar(64) NOT NULL,
    col4 datetime DEFAULT NULL,
    PRIMARY KEY (`col1 `),
    UNIQUE KEY col2  (`col2`)
) ENGINE=InnoDB AUTO_INCREMENT=572 DEFAULT CHARSET=utf8$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `myproc`(IN username 
VARCHAR(255))
BEGIN
    DECLARE var1 VARCHAR(64);
    DECLARE expirationDate DATETIME;

    SET var1 = 12345;
    SET expirationDate = DATE_ADD(NOW(), INTERVAL 30 SECOND);

    REPLACE INTO tbl_name (col2, col3, col4) VALUES (someval, var1, expirationDate);
END$$

DELIMITER ;

当我第一次运行脚本时,它创建了表并在 MySQL Workbench 中执行了存储过程。当我第二次运行同样的事情时,我得到了错误 1304 过程已经存在。

我在网上查看了here 关于删除程序然后重新创建的信息。但是当我在创建程序之前输入以下命令时,CREATE 命令出现错误,代码为 1064。

DROP PROCEDURE IF EXISTS myproc;
CREATE DEFINER=`root`@`localhost` PROCEDURE `myproc`(IN username 
    VARCHAR(255))
.
.
.

我对 mysql 非常陌生,如果它已经存在,我不确定如何执行该过程。

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql database stored-procedures


    【解决方案1】:

    由于您更改为DELIMITER $$,因此您需要在每个语句的末尾使用该分隔符,直到您将其改回。

    DROP PROCEDURE 和 CREATE PROCEDURE 是独立的语句,每个语句都需要自己的语句分隔符。

    DROP PROCEDURE IF EXISTS myproc $$
    

    注意上面行尾的分隔符。

    CREATE DEFINER=`root`@`localhost` PROCEDURE `myproc`(IN username 
        VARCHAR(255))
    .
    .
    .
    END $$
    

    整个 CREATE PROCEDURE 语句末尾的另一个分隔符。

    【讨论】:

    • 嘿@Bill,感谢您的回复。我已经将分隔符放在每个过程的末尾,然后再将其更改回分号';'
    • @Naphstor,请参阅上面我编辑的答案以获得一些说明。
    猜你喜欢
    • 2012-10-18
    • 2015-12-25
    • 2014-12-24
    • 2014-03-21
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多