MySQLは例外をスローせずにテーブルが存在するかどうかを確認します


123

例外をスローせずにMySQLに(できればPHPのPDOを介して)テーブルが存在するかどうかを確認する最良の方法は何ですか。「SHOW TABLES LIKE」などの結果を解析したくありません。なんらかのブールクエリが必要ですか?

回答:


199

そのPDO構文はわかりませんが、これは非常に簡単なようです。

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

おかげで、SHOW TABLES LIKEを1つの正確なテーブルのみに制限できることを完全に忘れてい
ました

53
PDO:$ tableExists = $ db-> query( "SHOW TABLES LIKE 'myTable'")-> rowCount()> 0;
Reactgular

4
mysqli:if($ db-> query( "SHOW TABLES LIKE 'myTable'")-> num_rows == 0){//テーブルを作成}
zPuls3

1
@MathewFoscarini、ROWCOUNTが()を参照し、この場合には信頼性がないかもしれないPHPドキュメントを
datasn.io 2015

4
ありませんこれ以上の支援のためのmysql_*機能は、彼らがされて正式に廃止予定もはや維持され、削除将来的に。PDOまたはMySQLiを使用してコードを更新し、将来プロジェクトの機能を確保する必要があります。
TRiG 2016年

39

MySQL 5.0以降を使用している場合は、次のことを試してください。

SELECT COUNT(*)
FROM information_schema.tables 
WHERE table_schema = '[database name]' 
AND table_name = '[table name]';

結果はすべて、テーブルが存在することを示しています。

送信元:http : //www.electrictoolbox.com/check-if-mysql-table-exists/


多分私は何かが足りないのですが、なぜSHOW TABLESに対してこのメ​​ソッドを使用するのですか?
nickf 2009年

1
@nickfこれはansi標準の一部であるため、異なるrdbms間で移植可能です。
troelskn

@nickf:MySQL以外のデータベースでも動作します。これには、PostgreSQLとSQL Serverが含まれます。
Powerlord、2009年

これがセキュリティの悪用であるかどうか疑問に思います。接続していないデータベースから情報を照会できます...
Talvi Watia

3
セキュリティ上のリスクはありません-information_schemaデータベースへのクエリは、接続されたユーザーが特権を持っているテーブルのみを表示します。
Warren Rumak、2011年

8

mysqliを使用して、次の関数を作成しました。$ conと呼ばれるmysqliインスタンスがあると仮定します。

function table_exist($table){
    global $con;
    $table = $con->real_escape_string($table);
    $sql = "show tables like '".$table."'";
    $res = $con->query($sql);
    return ($res->num_rows > 0);
}

それが役に立てば幸い。

警告: @jcaronによって引き起こされたように、この関数はsqlinjection attacsに対して脆弱である可能性があるため、$tablevarがクリーンであることを確認するか、パラメーター化されたクエリをより適切に使用してください。


信頼できないソースからデータを取得した場合にのみ、誰かが$ table変数に値を入力できるようにした場合のみ、SQLステートメント内のすべての変数が危険であるとは限りません。もちろん、あなたはあなたが関数をどのように使用し、フィルタリングを行うかについて責任があります。この回答に反対票を投じる必要はありません。
2016年

このようなコードを公開すると、データが適切にチェックされていない場所で誰かがそのコードを使用することになり、SQLインジェクションが発生します。パラメータ化されたリクエストを使用するだけで、データがチェックされているかどうかにかかわらず、問題を回避できます。ここでそうしない理由は何もありません。それは単に悪い習慣です。
jcaron

real_escape_stringを追加するのはどうですか?
フォーク2016年

パラメータ化されたクエリを使用して、ホラーストーリーを避けます。
jcaron

4

これは、誰かがこの質問を探しに来た場合にのみ投稿されます。それは少し答えられましたが。一部の返信では、必要以上に複雑になっています。

私が使用したmysql *の場合:

if (mysqli_num_rows(
    mysqli_query(
                    $con,"SHOW TABLES LIKE '" . $table . "'")
                ) > 0
        or die ("No table set")
    ){

PDOで私は使用しました:

if ($con->query(
                   "SHOW TABLES LIKE '" . $table . "'"
               )->rowCount() > 0
        or die("No table set")
   ){

これで、else条件をorにプッシュするだけです。そして、私のニーズのために、私は単に死ぬ必要があります。他のものに設定することもできますが。一部の人はif / else if / elseを好むかもしれません。次に、削除またはif / else if / elseを指定します。


3

これが、ストアドプロシージャを使用するときに私が好む私のソリューションです。テーブルをチェックするためのカスタムmysql関数が現在のデータベースに存在する。

delimiter $$

CREATE FUNCTION TABLE_EXISTS(_table_name VARCHAR(45))
RETURNS BOOLEAN
DETERMINISTIC READS SQL DATA
BEGIN
    DECLARE _exists  TINYINT(1) DEFAULT 0;

    SELECT COUNT(*) INTO _exists
    FROM information_schema.tables 
    WHERE table_schema =  DATABASE()
    AND table_name =  _table_name;

    RETURN _exists;

END$$

SELECT TABLE_EXISTS('you_table_name') as _exists

2

大規模なデータベースでは「テーブルの表示」が遅くなる可能性があるため、「DESCRIBE」を使用して、結果としてtrue / falseが返されるかどうかを確認することをお勧めします

$tableExists = mysqli_query("DESCRIBE `myTable`");

「SHOW」が非効率になった場合に読んだ内容から、「information_schema」の方が「DESCRIBE」よりも優先されます。
Esoterica

-1
$q = "SHOW TABLES";
$res = mysql_query($q, $con);
if ($res)
while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
{
    foreach( $row as $key => $value )
    {
        if ( $value = BTABLE )  // BTABLE IS A DEFINED NAME OF TABLE
            echo "exist";
        else
            echo "not exist";
    }
}

2
最高の回答品質を提供するために、コードに正確なコメントを追加してください。一部のコードを貼り付けるだけでは、質問の作成者にはあまりわかりません。
Jakub Matczak 2013

5
これは実際には恐ろしいことです。したがって、50,000個のテーブルがある場合、すべてのテーブルをロードし、それぞれをループして正しいテーブルが存在するかどうかを確認しますか?
Rohit Chopra 2013年

-1

Zendフレームワーク

public function verifyTablesExists($tablesName)
    {
        $db = $this->getDefaultAdapter();
        $config_db = $db->getConfig();

        $sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{$config_db['dbname']}'  AND table_name = '{$tablesName}'";

        $result = $db->fetchRow($sql);
        return $result;

    }


-9

なぜあなたはそれを理解するのがとても難しいのですか?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.