mytable
指定されたテーブルが存在するかどうかだけでなく、そのスキーマが本来あるべきものと似ているかどうかもチェックする (多かれ少なかれ) 標準的な方法はありますか? 私はH2 データベースを試しています。
CREATE TABLE IF NOT EXISTS mytable (....)
ステートメントは明らかにテーブルの名前のみをチェックします。指定された名前のテーブルがあり、スキーマが異なる場合、例外が発生すると予想されます。
mytable
指定されたテーブルが存在するかどうかだけでなく、そのスキーマが本来あるべきものと似ているかどうかもチェックする (多かれ少なかれ) 標準的な方法はありますか? 私はH2 データベースを試しています。
CREATE TABLE IF NOT EXISTS mytable (....)
ステートメントは明らかにテーブルの名前のみをチェックします。指定された名前のテーブルがあり、スキーマが異なる場合、例外が発生すると予想されます。
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'TableName'
AND TABLE_SCHEMA = 'public'
CREATE TABLE IF NOT EXISTS ...
標準の SQL コードではありません。
やるべきことは、テーブルがすでにカタログにあるかどうかを確認することです。たとえば、Java では次のようなことができます。
connection.getMetaData().getTables(connection.getCatalog(), null, null, null)
詳細については、javadoc java.sql.Connectionを参照してください。
二重の答え:
(a) テーブルの存在は、実行時にアプリケーション自体ではなく、アプリケーションのインストール手順によって保証されるべきものです。
(b) (a) から逸脱する正当な理由があると本当に思う場合は、SQL 標準の INFORMATION_SCHEMA によって多かれ少なかれ構造が規定されているテーブルで構成されるデータベースであるカタログをクエリしてみることができます。 . どのテーブルが存在するか、どの列があるか、それらの列がどのデータ型であるか、どのキーが宣言されているかなど、すべてそこにあります。
この機能をネイティブに備えているデータベースを私は知りません。
それを使用したことはありません(これを行うために私自身のコードをロールバックしました)が、おそらくApacheDdlUtilsが役立つでしょう。
特に、さまざまなデータベースベンダーと連携させたい場合は、注意が必要です。また、合格するためにスキーマがどれほど類似している必要があるかについては、おそらく異なる意見があります。列名、列の順序、列の種類、主キーの定義:確かに。しかし、制約、制約の名前、テーブルスペースの定義などはどうでしょうか。