检查数据库表是否存在


11

我读过Wordpress Codex和专业Wordpress。似乎两者都使用类似

if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {

确定表是否存在。有什么理由CREATE TABLE IF NOT EXISTS ( ... )不使用?它将在1个查询中检查并创建表,这会更好吗?还是我错过了什么?

Answers:


10

如果您使用“ IF NOT EXISTS”,那么dbdelta脚本将不会使用最初创建数据库后出现的delta来升级数据库。

(假设您想重新使用相同的SQL脚本)

至少...那是我的想法


5

免责声明:我不是WordPress专家,只有MySQL DBA

如果要使用其他查询,请尝试此操作

SELECT COUNT(1) FROM information_schema.tables WHERE table_schema='dbname' AND table_name='tbname';

它将返回0(如果表不存在)或1(如果表存在)


3

试试这个:

global $wpdb;
$table_name = $wpdb->base_prefix.'custom_prices';
$query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $table_name ) );

if ( ! $wpdb->get_var( $query ) == $table_name ) {
    // go go
}

1
编辑您的答案,并添加解释:为什么这可以解决问题?
fuxia

1

不知道如何或为什么这样,但是我可以:

if (in_array('snippets', $wpdb->tables)) {
  // do something if wp_snippets exists
}

2
正如我在测试中发现的那样,这仅适用于核心表
Manchumahara

它对我来说很适合检测Code Snippets插件的表。
iSWORD

0

使用类中的get_var函数wpdb进行异常处理:

try {
    $wpdb->hide_errors();
    $wpdb->get_var( 'SELECT COUNT(*) FROM ' . $wpdb->prefix . 'translator' );
    $wpdb->show_errors();
} catch (Exception $e) {
    error_log($e);
} finally {
    translator_create_db();
}

参考:选择变量

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.