web-dev-qa-db-ja.com

データベーステーブルが存在するかどうかの確認

私はワードプレスコーデックスとプロのワードプレスを読みました。どちらも次のように使用しているようです

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

テーブルが存在するかどうかを確認します。 CREATE TABLE IF NOT EXISTS ( ... )が使われない理由はありますか? 1回のクエリでテーブルをチェックして作成しますが、それより良くないでしょうか。それとも私は何かが足りないのですか?

8
JM at Work

"IF NOT EXISTS"を使用した場合、dbdeltaスクリプトはデータベースの初期作成後に表示されたデルタでデータベースをアップグレードしません。

(同じSQLスクリプトを再利用したいとします)

少なくとも...それが私が思うことです

9
edelwater

免責事項:私はWordPressの達人ではなく、MySQL DBAだけです

別のクエリを使用したい場合は、これを試してください。

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

テーブルが存在しない場合は0、テーブルが存在する場合は1を返します。

4
RolandoMySQLDBA

このクエリを実行すると、常にデータベースエラーのログが作成されます。 tableが存在する場合はうまく機能しますが、存在しない場合は以下のデバッグログを生成します。

データベーステーブルが存在するかどうかを確認したり、デバッグログファイルをいっぱいにしてこれらのエラーを回避するための代替方法はありますか。

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

デバッグログ:

[09-Sep-2018 12:21:50 UTC] WordPress database error Table 'splivemain_db.wp_survey_popup_form' doesn't exist for query DESCRIBE wp_survey_popup_form; made by do_action('omxl-logger_page_omxl-cf7'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, myplugin__Logger->display, myplugin__Logger->get_columns

[09-Sep-2018 12:21:50 UTC] WordPress database error Table 'splivemain_db.wp_survey_popup_form' doesn't exist for query DESCRIBE wp_survey_popup_form; made by do_action('omxl-logger_page_omxl-cf7'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, myplugin__Logger->display, myplugin__Logger->get, myplugin__Logger->get_columns

[09-Sep-2018 12:21:50 UTC] WordPress database error Table 'splivemain_db.wp_survey_popup_form' doesn't exist for query SELECT* FROM wp_survey_popup_form WHERE 1=1 ORDER BY activity_date DESC LIMIT 0, 10 made by do_action('omxl-logger_page_omxl-cf7'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, myplugin__Logger->display, myplugin__Logger->get
0
OmAk

これを試してください。

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
}
0

これがどのようにまたはなぜ機能するのかわからないが、私はできる:

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