【问题标题】:MySQL Select row-count if table existsMySQL 如果表存在则选择行数
【发布时间】:2015-12-03 10:46:48
【问题描述】:

我正在尝试从表中获取行数,但前提是它存在。 (在一个 SQL 语句中。)

来自this 问题,如果存在,则答案不会从表中返回行数。如果 MySQL 不抛出错误“表不存在”,如何做到这一点??

我的SQL如下:

SELECT CASE
    WHEN
        ( (SELECT COUNT(*) FROM `information_schema`.`tables` WHERE `table_schema` = DATABASE() AND `table_name` = 'testTbl') > 0 )
    THEN
        (SELECT COUNT(*) FROM `testTbl`)
    ELSE
        (SELECT 0)
    END;

编辑:WHEN-part 返回正确的值(如果表不存在则为 0,如果存在则为 1)。 真正的问题是,当表格不存在时,整个 SQL 没有返回/选择“0”,而是返回错误。 (因为THEN子句中提到了不存在的表,从而破坏了之前检查它是否存在的整个目的。换句话说,它不能忽略COUNT-语句中的THEN-表不存在时的子句。)

这是个问题,因为我希望返回的值是整数(或数值)。

【问题讨论】:

  • @Phillip,我很想知道你最终是如何需要这样做的,它有一股淡淡的代码气味。
  • @Rob,我通常会使用 2 个单独的查询来执行此操作,但对于这种情况,我需要将它放在一个查询中。所以,这才是真正的问题哈哈
  • 不管有多少查询,你为什么要这样做?
  • 作为在图表中显示的预处理数据的一部分,我需要表的行数(如果不存在,则为 0)作为 PHP 执行和检索的单个查询(在 Wordpress 中) 与get_var() 通话
  • 我找到了解决方案,我想:)

标签: php mysql


【解决方案1】:

我环顾四周,发现了这个帖子。如果表存在,我想计算表中的行数,如果表不存在,则返回-1。 将[database_name][table_name] 替换为您自己的值。

SELECT MAX(TABLE_ROWS) AS TABLE_ROWS 
       FROM information_schema.tables 
            WHERE TABLE_SCHEMA = '[database_name]' 
            AND TABLE_NAME = '[table_name]'

此查询返回一列 TABLE_ROWS,其唯一行包含 [table_name](如果表存在)或 NULL(如果 [table_name] 不存在)的行数。

如果我想在表不存在的情况下返回-1 而不是NULL,我使用以下查询:

SELECT IFNULL(MAX(TABLE_ROWS), -1) AS TABLE_ROWS 
       FROM information_schema.tables 
            WHERE TABLE_SCHEMA = '[database_name]' 
            AND TABLE_NAME = '[table_name]'

【讨论】:

    【解决方案2】:

    您必须在查询之前检查故事是否存在:

    SHOW TABLES LIKE testTbl;
    

    试试这个:

    SELECT COUNT(*)
    FROM information_schema.tables 
    WHERE table_schema = '[database name]' 
    AND table_name = '[table name]';
    

    如果您从查询中得到任何结果而不是表存在!

    【讨论】:

    • 我试过了:IF( EXISTS( SELECT * FROM information_schema.tables` 其中table_schema = DATABASE() AND table_name = 'testTbl' ) ) BEGIN (SELECT COUNT(*) FROM testTbl) END`,但它不起作用..
    • IF( EXISTS ( SELECT * FROM testTbl ) ) BEGIN (SELECT COUNT(*) FROM testTbl) END 也不起作用,我很害怕。 Is 给出语法错误。
    • 正如我的问题所述,问题不在于我无法检查表是否存在,而是我想返回该表的行数(如果存在)或“0”如果没有
    • 您可以在这里找到操作方法:electrictoolbox.com/check-if-mysql-table-exists
    • 我明白如何检查表是否存在:) 那不是问题
    【解决方案3】:

    我找到的最接近我的问题的解决方案是从information_schema 表中获取table_rows 列(如果该表存在):

    SELECT IF(
        (SELECT COUNT(*) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = (DATABASE()) AND `TABLE_NAME` = 'tokens_331698')>0,
            (SELECT `TABLE_ROWS` as `x` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = (DATABASE()) AND `TABLE_NAME` = 'tokens_331698'),
            0
    )
    

    唯一的问题是我不确定这个行计数值有多准确。 (有人吗?)

    【讨论】:

    • 根据表引擎的不同,它可能是从非常不准确到合理估计的任何东西。 InnoDB 特别不可靠。
    • 根据 MySQL 的文档,只有 InnoDB 有这个问题(dev.mysql.com/doc/refman/5.0/en/tables-table.html)。或者这与 MyISAM 表一样吗?
    猜你喜欢
    • 2020-01-01
    • 2014-09-12
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多