【问题标题】:mysql drop table if exists inside proceduremysql删除表如果存在于过程中
【发布时间】:2012-10-18 21:06:36
【问题描述】:

我正在尝试将嵌套集模型示例与过程一起应用。我用这种技术找到了很多,在这个过程中我发现了一个问题。每次我调用该程序时,我都会收到unknown table XXX。当我创建程序时,我完全没有问题。快速示例:

CREATE PROCEDURE `sp_getRoleTree` (IN root INT)
  READS SQL DATA
BEGIN
    DECLARE rows SMALLINT DEFAULT 0;
    DROP TABLE IF EXISTS ROLE_TREE;
    CREATE TABLE ROLE_TREE (
        nodeID INT PRIMARY KEY
    ) ENGINE=HEAP;

    INSERT INTO ROLE_TREE VALUES (root);

    SELECT * FROM ROLE_TREE;
    DROP TABLE ROLE_TREE;
END;

所以我的问题是,我在这里做错了什么(它是示例代码),如果代码没问题,我可以禁用 if exists 的警告吗?导致此类警告的过程中是否存在特殊循环?

【问题讨论】:

  • 为什么需要这张桌子?如果您想从过程中输出数据集 - 只需运行 SELECT 查询。
  • 不仅仅是一个数据集......一个嵌套集,它用于分层数据的父子孙关系。基本上,您创建一个可以获取以评估关系的表层次结构。上面的例子是实际过程的一部分

标签: mysql procedure sql-drop


【解决方案1】:

作为一种解决方法:尝试截断表而不是重新创建。

不要使用DROP TABLE/CREATE TABLE。创建此表一次(或在需要时)并使用TRUNCATE TABLE 命令。

【讨论】:

  • 这似乎是一个可能的解决方案。不过,请不要理解为什么像 Peter Brawley 和 Arthur Fuller 所著的 Get It Done With MySQL 5&6 这样的书籍解释了这种解决方案而没有提及这种类型或错误。这是一个mysql错误吗?还是配置问题?
  • 看起来像配置问题。
【解决方案2】:

当表不存在时,当使用DROP TABLE IF EXISTS tbl; 时,MySQL 会生成警告。这可能会令人困惑,甚至可能违反直觉,但这是预期的行为。

来自http://dev.mysql.com/doc/refman/5.5/en/drop-table.html

使用 IF EXISTS 可防止不存在的表发生错误。使用 IF EXISTS 时,会为每个不存在的表生成一个 NOTE。请参阅第 13.7.5.41 节,SHOW WARNINGS Syntax

IF EXISTS 防止 MySQL 抛出错误,这很好,但如果表不存在,它会导致警告。没有选项可以禁止显示此警告。

【讨论】:

  • 谢谢,我最后遵循了@Devart 解决方案(这对我来说似乎是合乎逻辑的,因为程序在程序上运行)但是您的额外信息总是有帮助
猜你喜欢
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多