如何检查PHP表是否存在MySQL表?

时间:2011-06-21 21:24:26

标签: php mysql if-statement

理论上听起来很简单,我做了大量的研究,但我很难搞清楚这一点。

如何检查MySQL表是否存在以及它是否确实存在。 (我想一个简单的php if / else语句可以用于此)

有办法做到这一点吗?

这就是我对cwallenpoole的回应所做的:

mysql_connect("SERVER","USERNAME","PASSWORD");
mysql_select_db('DATABASE');

$val = mysql_query('select 1 from `TABLE`');

if($val !== FALSE)
{
   print("Exists");
}else{
   print("Doesn't exist");
}

12 个答案:

答案 0 :(得分:68)

// Select 1 from table_name will return false if the table does not exist.
$val = mysql_query('select 1 from `table_name` LIMIT 1');

if($val !== FALSE)
{
   //DO SOMETHING! IT EXISTS!
}
else
{
    //I can't find it...
}

不可否认,它更像Pythonic而不是PHP习惯用法,但另一方面,你不必担心处理大量的额外数据。

修改

所以,在我写这条消息时,这个答案已被标记至少两次。假设我犯了一些巨大的错误,我去了,我运行了一些benchmarks,这就是我发现当表不存在时,我的解决方案比最近的替代方案快10%以上,并且超过25当表存在时,速度快%:

:::::::::::::::::::::::::BEGINNING NON-EXISTING TABLE::::::::::::::::::::::::::::::
23.35501408577 for bad select
25.408507823944 for select from schema num rows -- calls mysql_num_rows on select... from information_schema.
25.336688995361 for select from schema fetch row -- calls mysql_fetch_row on select... from information_schema result
50.669058799744 for SHOW TABLES FROM test
:::::::::::::::::::::::::BEGINNING EXISTING TABLE::::::::::::::::::::::::::::::
15.293519973755 for good select
20.784908056259 for select from schema num rows
21.038464069366 for select from schema fetch row
50.400309085846 for SHOW TABLES FROM test

我尝试在DESC上运行此操作,但是我在276秒后超时(我的答案为24秒,276未能完成对现有表的描述)。

为了更好地衡量,我正在针对仅包含四个表的模式进行基准测试,这是一个几乎全新的MySQL安装(这是迄今为止唯一的数据库)。要查看导出,请查看here

AND FURTHERMORE

此特定解决方案也更加独立于数据库,因为相同的查询将在PgSQL和Oracle中起作用。

最后

对于不是“此表不存在”的错误,

mysql_query()返回FALSE。

如果您需要保证表不存在,请使用mysql_errno()获取错误代码并将其与相关的MySQL errors进行比较。

答案 1 :(得分:23)

在PHP中实现这一目标的最简单方法是简单地使用DESCRIBE语句。

if(mysql_query("DESCRIBE `table`")) {
    // Exists
}

我不确定为什么其他人会为这样一个直接的问题发布复杂的查询。

答案 2 :(得分:13)

$res = mysql_query("SELECT table_name FROM information_schema.tables WHERE table_schema = '$databasename' AND table_name = '$tablename';");

如果没有返回任何记录,那么它就不存在。

答案 3 :(得分:11)

存在125微秒表检查

.000125秒。 (125微秒)

mysql_unbuffered_query("SET profiling = 1");  // for profiling only

@mysql_unbuffered_query("SELECT 1 FROM `table` LIMIT 1 ");
if (mysql_errno() == 1146){

 // NO EXISTING TABLE CODE GOES HERE

}
elseif(mysql_errno() > 0){

  echo mysql_error();    

}

$results = mysql_query("SHOW PROFILE");  // for profiling only

当表存在或不存在时,使用mysql分析测量的执行时间约为 .000125秒。 (125μs)

LIMIT 1对速度很重要。这最小化了排序结果和发送数据查询状态时间。而表格大小不是一个因素。

当不需要任何结果时,我总是使用无缓冲的查询。

个人资料结果 当桌子不存在时

QUERY STATE           SECONDS   
--------------------  -------
starting              0.000025  
checking permissions  0.000006  
Opening tables        0.000065  
query end             0.000005  
closing tables        0.000003  
freeing items         0.000013  
logging slow query    0.000003  
cleaning up           0.000003  
TOTAL                 0.000123  <<<<<<<<<<<< 123 microseconds

表格清单

QUERY STATE           SECONDS   
--------------------  -------
starting              0.000024
checking permissions  0.000005
Opening tables        0.000013
System lock           0.000007
init                  0.000006
optimizing            0.000003
statistics            0.000009
preparing             0.000008
executing             0.000003
Sending data          0.000019
end                   0.000004
query end             0.000004
closing tables        0.000006
freeing items         0.00001
logging slow query    0.000003
cleaning up           0.000003
TOTAL                 0.000127 <<<<<<<<<<<< 127 microseconds

答案 4 :(得分:9)

mysql_query("SHOW TABLES FROM yourDB");
//> loop thru results and see if it exists
//> in this way with only one query one can check easly more table 

mysql_query("SHOW TABLES LIKE 'tblname'");

不要使用mysql_list_tables();,因为它已被弃用

答案 5 :(得分:6)

比查询错误更快:

SELECT count((1)) as `ct`  FROM INFORMATION_SCHEMA.TABLES where table_schema ='yourdatabasename' and table_name='yourtablename';

这样您就可以只检索一个字段和一个值。我的慢速系统.016秒。

答案 6 :(得分:4)

显示表格'TableName'

如果您有任何结果,则该表存在。

在PDO中使用此方法:

$pdo         = new \PDO(/*...*/);
$result      = $pdo->query("SHOW TABLES LIKE 'tableName'");
$tableExists = $result !== false && $result->rowCount() > 0;

将此方法与DEPRECATED mysql_query

一起使用
$result      = mysql_query("SHOW TABLES LIKE 'tableName'");
$tableExists = mysql_num_rows($result) > 0;

答案 7 :(得分:3)

它已经发布但是这里是PDO(同样的查询)......

$connection = new PDO ( "mysql:host=host_db; dbname=name_db", user_db, pass_db );

if ($connection->query ("DESCRIBE table_name"  )) {
    echo "exist";
} else {
    echo "doesn't exist";
}

对我来说就像一个魅力......

这是另一种方法(我认为它更慢)......

if ($connection->query ( "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name' AND table_name ='tbl_name'" )->fetch ()) {
    echo "exist";
} else {
    echo "doesn't exist";
}

您也可以使用此查询:

SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'

我认为这建议在mysql页面中使用。

答案 8 :(得分:2)

不要再使用MYSQL了。如果你必须使用mysqli但PDO是最好的:

$pdo = new PDO($dsn, $username, $pdo); // proper PDO init string here
if ($pdo->query("SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name'")->fetch()) // table exists.

答案 9 :(得分:0)

或者你可以使用

显示Tables_in_ {insert_db_name} ='tablename';

的表格

答案 10 :(得分:0)

您可以使用许多不同的查询来检查表是否存在。以下是几个之间的比较:

mysql_query('select 1 from `table_name` group by 1'); or  
mysql_query('select count(*) from `table_name`');

mysql_query("DESCRIBE `table_name`");  
70000   rows: 24ms  
1000000 rows: 24ms  
5000000 rows: 24ms

mysql_query('select 1 from `table_name`');  
70000   rows: 19ms  
1000000 rows: 23ms  
5000000 rows: 29ms

mysql_query('select 1 from `table_name` group by 1'); or  
mysql_query('select count(*) from `table_name`');  
70000   rows: 18ms  
1000000 rows: 18ms  
5000000 rows: 18ms  

这些基准只是平均值:

答案 11 :(得分:0)

<?php 
$connection = mysqli_connect("localhost","root","","php_sample_login_register"); 

if ($connection){
        echo "DB is Connected <br>";
        $sql = "CREATE TABLE user(
            id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
            name VARCHAR(255)NOT NULL,
            email VARCHAR(255)NOT NULL,
            password VARCHAR(255) NOT NULL
            );";
        if(mysqli_query($connection,$sql)) {
            echo "Created user table";
        } else{
            echo "User table already exists";
        }
    } else {
        echo "error : DB isnot connected";
    } ?>