代码之家  ›  专栏  ›  技术社区  ›  Petruza

是否有一个命令来测试SQL查询而不执行它MySQL或ANSI SQL)

  •  21
  • Petruza  · 技术社区  · 15 年前

    有这样的事吗:
    TEST DELETE FROM user WHERE somekey = 45;


    我知道您可以轻松地在select查询中打开任何在任何行中都没有写或删除效果的查询,但是这可能会导致错误,如果您想测试和调试许多查询,这不是很实际。

    8 回复  |  直到 15 年前
        1
  •  2
  •   Giles    6 年前

    如果目的是在不返回任何行的情况下找到查询处理时间(我经常需要它,我想知道我正在使用的一段代码在不返回几百万行的情况下需要多长时间,我对此不感兴趣),那么黑洞引擎可能非常有用:

    https://dev.mysql.com/doc/refman/8.0/en/blackhole-storage-engine.html

    例如,假设我有两个表,t1&t2,有数百万行,我正在连接在一起。我想在GUI(SQLYog或mysql workbench或类似的东西)中检查这可能需要多长时间,而不返回数百万行,这些行将占用内存,可能需要GUI处理和显示时间。我用黑洞引擎把这些行“甩”到任何地方。

    CREATE TABLE tBH (a TINYINT) ENGINE = BLACKHOLE;
    SELECT NOW(); -- Show start time
    INSERT tBH 
    SELECT 1 FROM t1
    LEFT JOIN t2 ON t1.key1 = t2.key1;
    SELECT NOW(); -- Show end time
    

    注意,因为我只是在寻找执行时间,所以我不需要返回所有列(即带有“*”),而只返回一个占位符(在本例中为“1”)。

        2
  •  46
  •   DCNYAM    15 年前

    我所知道的唯一一件事是将它包装在一个总是回滚的事务中:

    BEGIN TRANSACTION
    
    DELETE FROM user WHERE somekey = 45;
    
    ROLLBACK TRANSACTION
    

    确保执行整个块,而不仅仅是delete语句。另外,不要在任何生产环境或系统上运行此程序,因为在这些环境或系统中,您无法承受数据丢失的代价。

        3
  •  12
  •   DOOManiac    6 年前

    从MySQL5.6开始 EXPLAIN 关键字用于 SELECT DELETE INSERT , REPLACE UPDATE 声明。

    如果您的查询有语法错误,那么它仍然会失败,但是如果成功,您将只看到解释的结果,并且查询不会进行任何更改。

    更多信息: https://dev.mysql.com/doc/refman/5.6/en/explain.html

        4
  •  8
  •   絢瀬絵里    12 年前

    START TRANSACTION;
    QUERY;
    

    使用“;”很重要因为如果你不这样做,那就没用了。例如

    START TRANSACTION;
    UPDATE tableX SET colX = valueA, colY = valueB WHERE id=1
    

    http://dev.mysql.com/doc/refman/5.0/en/commit.html

        5
  •  6
  •   Larry Lustig    8 年前

    ANSI SQL:否。

        6
  •  0
  •   Klaus Byskov Pedersen    15 年前

    据我所知,不存在这样的事。此外,如果没有,也不会是一个错误 somekey 值为45的不存在。它不会删除任何内容。

        7
  •  0
  •   Bhargav Rao rlgjr    9 年前

    11层

        8
  •  0
  •   Jon S    8 年前

    有点假设您有一个要更新的表:“Entry”。你可以

    SELECT Col1 = OTHER.Col4,
           Col2 = EXTRA.Col2,
    FROM dbo.Entry E
        INNER JOIN MYOTHERTABLE OTHER ON OTHER.Id = E.Id
        INNER JOIN MYEXTRATABLE EXTRA ON EXTRA.Id = OTHER.Id
    

    在本例中,Col1和Col2是Entry表的列。如果你写了

    UPDATE E
    SET
    

    而不是最初的选择,你会有你的更新。它并不适用于所有场景,但是,如果只是一个简单的更新,您可以通过这种方式快速预览。

        9
  •  0
  •   Engle    5 年前

    这是一个老问题,但在今天寻找同样的东西后,我有点解决了它

    $prepResult = $connection->prepare($query);

    似乎适用于大多数情况-这意味着它可靠地检查语法,但 对数据库进行测试。 因此,例如INSERT-INTO,在INT列中插入字符串、删除未知表以及截断未知表时都不会失败。。。

    所以,这将带你到那里-半路;)