如果表存在,MySQL选择行计数

3

我想要从一个表中获取行数,但只有在该表存在时才获取。(在一个SQL语句中)

来自这个问题的答案如果存在表不会返回该表的行数。如何在没有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 部分返回正确的值(如果表不存在为0,存在则为1)。 真正的问题在于整个 SQL 语句在表不存在时没有返回或选择“0”,而是返回错误。(因为非现有表格被提及在 THEN 子句中,这样就破坏了之前检查其是否存在的整个目的。换言之,在表不存在时它不能忽略 THEN 子句中的 COUNT 语句。)

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


1
@Phillip,我很想知道你是如何需要做这件事的,它有一点代码异味。 - Rob Forrest
@Rob,通常我会使用两个单独的查询来完成此操作,但在这种情况下,我需要它合并为一个查询。所以,这才是真正的问题哈哈。 - Philip
无论有多少查询,你为什么要这样做呢? - Rob Forrest
作为显示图表前的预处理数据的一部分,我需要一个表格的行数(如果不存在则为0),作为PHP的单个查询来执行和检索(在WordPress中)使用get_var()调用。 - Philip
我找到了一个解决方案,我想 :) - Philip
显示剩余2条评论
3个回答

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]'

0

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

SHOW TABLES LIKE testTbl;

试试这个:

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

如果您从查询中获得任何结果,则表存在!

1
我尝试了以下代码:IF( EXISTS( SELECT * FROM information_schema.tablesWHEREtable_schema= DATABASE() ANDtable_name= 'testTbl' ) ) BEGIN (SELECT COUNT(*) FROMtestTbl) END,但它并没有起作用。 - Philip
如果(存在(SELECT * FROM testTbl)) BEGIN (SELECT COUNT(*) FROM testTbl) END 很遗憾,它也不起作用。它会给出一个语法错误。 - Philip
正如我在问题中所述,问题不在于我无法检查表是否存在,而是我想返回该表的行数(如果存在),或者如果不存在则返回“0”。 - Philip
您可以在此处找到如何操作:http://www.electrictoolbox.com/check-if-mysql-table-exists/ - Franco
我知道如何检查表是否存在 :) 这不是问题 - Philip

-1
我找到的最接近解决我的问题的方法是从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特别不可靠。 - Rob Forrest
根据MySQL的文档,只有InnoDB存在这个问题(https://dev.mysql.com/doc/refman/5.0/en/tables-table.html)。或者MyISAM表也有同样的问题吗? - Philip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接