检查表是否存在而不使用"select from"

Ben*_*Ben 154 mysql sql

有没有办法检查表是否存在而没有选择并检查它的值?

也就是说,我知道我可以去SELECT testcol FROM testtable检查返回的字段数,但似乎必须有更直接/更优雅的方式来做.

Ser*_*sev 290

你不需要算什么.

SELECT 1 FROM testtable LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

如果没有错误,则表存在.

或者,如果您想要正确,请使用INFORMATION_SCHEMA.

SELECT * 
FROM information_schema.tables
WHERE table_schema = 'yourdb' 
    AND table_name = 'testtable'
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 SHOW TABLES

SHOW TABLES LIKE 'yourtable';
Run Code Online (Sandbox Code Playgroud)

如果结果集中有一行,则表存在.

  • 马克和我自己说这样做的方式是正确的方式.没有'exists'类型语句MySql.MySql中的"Exists"是一个需要SELECT,UPDATE或DELETE等操作的子句. (8认同)
  • 是的,这很好用,很优雅,但是仍然使用`SELECT ... FROM`语法...我有点在寻找类似`EXISTS testtable`的东西 (2认同)
  • @SergioTulentsev 不管标签如何,我更喜欢便携方式而不是专有方式。 (2认同)
  • @Filype 这并不是真正的问题,因为他只是检查查询是否成功。在表没有行的情况下,查询仍然会成功,只是结果集为空。 (2认同)

Mar*_*c B 62

SELECT count(*)
FROM information_schema.TABLES
WHERE (TABLE_SCHEMA = 'your_db_name') AND (TABLE_NAME = 'name_of_table')
Run Code Online (Sandbox Code Playgroud)

如果得到非零计数,则表存在.

  • 我真的不明白这里发生了什么。我已经检查了答案,因为我现在正在做,确实Sergio Tulentsevs的答案是更早的(1分钟),并提供3个解决方案,但这是最有效的。为什么要选择更多或我想要的其他东西?在这种情况下,我需要一个“布尔值” 1/0。该表是否存在。我不想限制一切,我不想喜欢任何东西,我不想任何错误。这应该是公认的答案。 (2认同)

小智 24

性能比较:

  • MySQL 5.0.77,在一个拥有大约11,000个表的数据库上.
  • 选择一个非最近使用的表,使其不被缓存.
  • 每次平均超过10次尝试.(注意:使用不同的表来完成以避免缓存).

322ms: show tables like 'table201608';

691ms: select 1 from table201608 limit 1;

319ms: SELECT count(*) FROM information_schema.TABLES WHERE (TABLE_SCHEMA = 'mydb') AND (TABLE_NAME = 'table201608');

请注意,如果您正在运行这么多 - 比如在很短的时间内通过许多HTML请求 - 第二个会更快,因为它将被缓存平均200毫秒或更快.


doo*_*gle 16

您可以查询INFORMATION_SCHEMA tables系统视图:

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'databasename'
AND table_name = 'testtable';
Run Code Online (Sandbox Code Playgroud)

如果没有返回任何行,则该表不存在.


Sta*_*ler 13

阅读完以上所有内容后,我更喜欢以下陈述:

SELECT EXISTS(
       SELECT * FROM information_schema.tables 
       WHERE table_schema = 'db' 
       AND table_name = 'table'
);
Run Code Online (Sandbox Code Playgroud)

它准确地指示您想要做什么,并且它实际上返回一个“布尔值”。

  • 这应该是公认的答案。简洁 (2认同)

ta.*_*.is 7

您可以查询INFORMATION_SCHEMA.TABLES表是否存在,而不是依赖于错误.如果有记录,则存在.如果没有记录,则不存在.


小智 7

这是一个不是SELECT*FROM的表

SHOW TABLES FROM `db` LIKE 'tablename'; //zero rows = not exist
Run Code Online (Sandbox Code Playgroud)

从数据库专家那里得到这个,这是我被告知的:

select 1 from `tablename`; //avoids a function call
select * from IMFORMATION_SCHEMA.tables where schema = 'db' and table = 'table' // slow. Field names not accurate
SHOW TABLES FROM `db` LIKE 'tablename'; //zero rows = not exist
Run Code Online (Sandbox Code Playgroud)


小智 5

上面的这个修改后的解决方案不需要当前数据库的明确知识。那么就更加灵活了。

SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'yourtable' 
AND TABLE_SCHEMA in (SELECT DATABASE());
Run Code Online (Sandbox Code Playgroud)