Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP检查MySQL表是否存在?_Php_Mysql_If Statement - Fatal编程技术网

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

如何使用PHP检查MySQL表是否存在?,php,mysql,if-statement,Php,Mysql,If Statement,虽然听起来很简单,但我已经做了大量的研究,很难弄明白这一点 我如何检查MySQL表是否存在,以及它是否做了什么。(我想一个简单的php if/else语句可以解决这个问题) 有办法做到这一点吗 这就是我对Cwallenpole的回答所做的: mysql_connect("SERVER","USERNAME","PASSWORD"); mysql_select_db('DATABASE'); $val = mysql_query('select 1 from `TABLE`'); if($va

虽然听起来很简单,但我已经做了大量的研究,很难弄明白这一点

我如何检查MySQL表是否存在,以及它是否做了什么。(我想一个简单的php if/else语句可以解决这个问题)

有办法做到这一点吗

这就是我对Cwallenpole的回答所做的:

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");
}
诚然,它比PHP习惯用法更具python风格,但另一方面,您不必担心处理大量额外数据

编辑 所以,在我写这封信的时候,这个答案至少被标记了两次。假设我犯了一些巨大的错误,我去运行了一些,这就是我发现,当表不存在时,我的解决方案比最近的备选方案快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安装(这是迄今为止唯一的数据库)。要查看导出,请查看

而且 这个特定的解决方案也更加独立于数据库,因为相同的查询将在PgSQL和Oracle中工作

最后
mysql\u query()
对于不是“此表不存在”的错误返回FALSE

如果需要确保表不存在,请使用
mysql\u errno()
获取错误代码并将其与相关数据进行比较

或者
mysql\u查询(“显示像'tblname'这样的表”)

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

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

如果未返回任何记录,则该记录不存在。

显示类似“TableName”的表格

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

在PDO中使用此方法:

$pdo         = new \PDO(/*...*/);
$result      = $pdo->query("SHOW TABLES LIKE 'tableName'");
$tableExists = $result !== false && $result->rowCount() > 0;
将此方法用于不推荐的mysql\u查询

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

不要再使用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.
或者你可以用


在{insert_db_name}='tablename'中显示表u所在的表

在PHP中实现这一点的最干净的方法就是简单地使用descripe语句

if ( mysql_query( "DESCRIBE `my_table`" ) ) {
    // my_table exists
}
我不知道为什么其他人会针对这样一个直截了当的问题发布复杂的查询

更新 使用PDO

// assuming you have already setup $pdo
$sh = $pdo->prepare( "DESCRIBE `my_table`");
if ( $sh->execute() ) {
    // my_table exists
} else {
    // my_table does not exist    
}

甚至比糟糕的查询更快:

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

这样,您只需检索一个字段和一个值。016秒用于我较慢的系统。

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

对我来说很有魅力

这里还有另一种方法(我认为速度较慢)

您还可以使用此查询:

SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'

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

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

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  
这些基准只是平均值:

125微秒表存在检查 .000125秒。(125微秒) 当表存在或不存在时,使用mysql评测测量的执行时间约为.000125秒。(125µs)

限制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
查询状态秒
--------------------  -------
从0.000025开始
正在检查权限0.000006
期初表0.000065
查询结束0.000005
截止表0.000003
释放项目0.000013
日志记录慢速查询0.000003
清理0.000003
总计0.000123<代码>


如果你有500多个表,那将需要大量迭代。这也在php文档中:@Nathan:有500个表的人不会问如何检查this@Nathan:你也可以用类似“”的图钉。@kevmo:永远不要用它。此函数已被弃用。MySQL文档建议查看架构信息是的,我可能从3.23天起就太老练了:)我如何检查结果?@NathanRomano文档并不意味着我们受到限制。通过执行->
$table_exists=$pdo->query('SHOW TABLES LIKE'tableName');变量转储($table\u存在)此输出
true
如果表存在,否则为false。我喜欢这种方法如何检查是否返回了记录?请检查我的基准测试,因为这似乎不是最快的,请在做出最终回答之前阅读下面的基准测试。请注意,如果您试图检查表是否存在以便添加它,如果它不存在,您可以使用类似
CREATE的查询表如果不存在“我的表”
Ok,我知道发生了什么<代码>!==FALSE
表示该表存在(答案已更新)。以下是我的测试:
mysql\u select\u db('test',$c);if(mysql_查询('select1fromfoo')!==FALSE)回显'foo';if(mysql_查询('SELECT 1 FROM bar')!==FALSE)回显'bar'foo不存在,bar不存在。我将“bar”输出到浏览器。在那里,我再次将其反弹到正+1。@j-j-kim虽然我同意
mysql\u query
有点过时,但这是我写答案时使用的原始函数,与pastebin代码使用的函数相同。为了保持一致性,我更愿意保持原样。注意:Drupal处理事情的方式恰好也是如此。
mysql\u query()
在出错时返回false,因此请在假设false表示“表不存在”之前检查错误。错误代码1146和1051是检查“未知表”的代码:这是所有解决方案中最慢的解决方案。@MichalM感谢您的富有洞察力的评论。让我们玩一个叫做“把你的钱放在嘴里”的游戏。我甚至不会提及这样一个事实,即您无论如何都应该缓存结果
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_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  
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
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
<?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";
    } ?>