質問
データベーステーブルがすでに存在するかどうかを判断するポータブルな方法はありますか?
解決
ポータブル?そうは思いません。
おそらく最も近いものは次のとおりです:
select * from <table>
テーブルが存在しない場合、これはエラーを返します。
他のヒント
これは、可搬性がありますが、残念ながら:
select
count(*)
from
information_schema.tables
where
table_name = 'tablename'
and table_schema = 'dbo'
これは、SQL Server、MySQL、Postgresで確実に機能します。ただし、Oracleではそれほどではありません。そのためには、Oracleデータディクショナリにアクセスする必要があります。ただし、 Oracleでinformation_schema
を作成するオープンソースプロジェクトがありますデータ辞書。絶対的な移植性が必要な場合は試してみてください。
PSスキーマはdbo
である必要はありませんが、最も一般的です。
私は言うだろう
select 'x' from <table_name> where 0=1;
欠点は、エラーが発生した場合、実際の原因が確実にわからないことです。テーブルが欠落しているか、または接続エラー。エラーメッセージを解析できますが、間違いなく移植性がありません。
INFORMATION_SCHEMAビューはANSI標準です。したがって、最もポータブルなオプションである必要があります。 where句にスキーマとテーブルタイプを追加することを忘れないでください...
if exists(select *
from information_schema.tables
where table_schema = 'dbo'
and table_name = 'MyTable'
and table_type = 'basetable')
begin
-- your code here
end
合理的に移植可能なものを次に示します。
TABLE制限1からnow()を選択;
特定の列の知識に依存しません。
count(*)のオーバーヘッドが発生することはありません。
テーブルが空かどうかは関係ありません。
テーブルが存在しない場合は失敗します。
すべてのDBMSには独自のメタベースがあるため、最も<!> quot; portable <!> quot;これを行う方法は、アプリケーションの呼び出し元自体を使用することです。
のようなものtry
execute("select top 1 * from table")
return (true)
catch
return false
テーブルを照会しようとしました。クエリが失敗した場合-エラーが発生した場合、それは存在しません。
それはおそらくあなたが手に入れることができる限り移植性が高いです。結果を生成する負担は、テーブル/データベースを照会するコードに依存します。
select top 1 *
from MyTable
他のエラーを防ぐため、クエリはできるだけシンプルにしてください。