理论上听起来很简单,但是我已经做了很多研究,但很难弄清楚。
我如何检查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"); }
// 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... }
诚然,它比Python惯用语言更具有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_query() 对于不存在“此表不存在”的错误,返回FALSE。
mysql_query()
如果您需要保证该表 不 存在,请使用mysql_errno()来获取错误代码并将其与相关的MySQL错误进行比较。
mysql_errno()