2009-07-02 14 views
1

テーブルのDDLクエリの配列があり、作成する各テーブルの名前を取得したいとします。テーブル名を抽出するのに最適なアプローチは何でしょうか?例えばのでPHPとSQLの構文解析

$ddl = array(
    'CREATE TABLE tableOne ...', 
    'CREATE TABLE tableTwo ...', 
    'CREATE TABLE tableThree ...' 
); 

foreach($ddl as $tableDef) { 
    $tableName = [???]; 
    echo $tableName; 
} 

だけに簡略化する場合ですが、私は、テーブル名を解析する方法を思ったんだけど。それは "CREATE TABLE"の後に来るものであると仮定するのは安全でしょうか?私が知っておくべき特別なケースはありますか?

答えて

2

MySQLはIF CREATE TABLEをサポートしています存在しないfoobar、あなたは考慮する必要があります。次のコードは、このトリックを行う必要があります:

foreach ($ddl as $tableDef) { 
    if (preg_match("/^CREATE\s+(?:TEMPORARY\s+)?TABLE\s+(?:IF NOT EXISTS\s+)?([^\s]+)/i", $tableDef, $matches)) { 
     $tableName = $matches[1]; 
    } 
} 
0

MySQL docsによると、CREATE TABLE通話の基本的な形は、ですから、TEMPORARY単語の可能性およびNOTが存在する場合は、文字列を考慮する必要があります

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name 
    (create_definition,...) 
    [table_options] 
    [partition_options] 

です。私はそれが面白い文字を含んでいる場合には、テーブル名がバックティックで引用されることも可能であると信じています(私はそれについて間違っているかもしれません)。あなたは、配列をコントロールしている場合

$ddl = array(
    'tableOne' => 'CREATE TABLE tableOne ...', 
    'tableTwo' => 'CREATE TABLE tableTwo ...', 
    'tableThree' => 'CREATE TABLE tableThree ...' 
); 

foreach ($ddl as $tablename => $sql) { ... } 

または正規表現...

/CREATE\s+(TEMPORARY\s+)*TABLE\s+(IF NOT EXISTS\s+)*(.*?)\s+/gi 
1

:ここ

は、正規表現で最初に行くのです

foreach ($ddl as $sql) { 
    if (preg_match('/CREATE(\s+|\s+TEMPORARY\s+).*\s+TABLE(\s+|\s+IF NOT EXISTS\s+)(\w[\w\d_]*)\s/imU', $sql, $match)) { 
     echo $match[3]; 
    } 
}