1

データベースが Java から空であるかどうかを検出する良い方法を提案できますか (少なくとも Microsoft SQL Server、Derby、および Oracle をサポートする必要があります)。

空の状態とは、データベースが新しい create database ステートメントで新しく作成された場合の状態を意味しますが、99% のケースをカバーする場合、チェックは 100% 完璧である必要はありません。

最初に考えたのは、こんなことをしたいということでした...

tables = metadata.getTables(null, null, null, null);
Boolean isEmpty = !tables.next();
return isEmpty;

...しかし、残念ながら、これにより、基礎となるシステム テーブルが多数得られます (少なくとも Microsoft SQL Server では)。

4

5 に答える 5

2

クロスデータベースの SQL-92 スキーマ クエリ標準がいくつかあります。もちろん、これに対するマイレージはベンダーによって異なります。

SELECT COUNT(*) FROM [INFORMATION_SCHEMA].[TABLES] WHERE [TABLE_TYPE] = <tabletype>

テーブル ビューの列の内容と同様に、これらのサポートはベンダーによって異なります。ここにある情報スキーマ ドキュメントの SQL 実装:

http://msdn.microsoft.com/en-us/library/aa933204(SQL.80).aspx

より具体的には、SQL Server では、sysobjects メタデータは SQL92 標準イニシアチブよりも前のものです。

SELECT COUNT(*) FROM [sysobjects] WHERE [type] = 'U'

上記のクエリは、データベース内の User テーブルの数を返します。sysobjects テーブルの詳細については、次を参照してください。

http://msdn.microsoft.com/en-us/library/aa260447(SQL.80).aspx

于 2008-09-23T04:08:04.210 に答える
1

これが完全な解決策であるかどうかはわかりませんが、getTablesによって返されるResultSetのtable_type列を読み取ることで、テーブルがシステムテーブルであるかどうかを判断できます。

int nonSystemTableCount = 0;
tables = metadata.getTables(null, null, null, null);
while( tables.next () ) {
    if( !"SYSTEM TABLE".equals( tables.getString( "table_type" ) ) ) {
        nonSystemTableCount++;
    }
}
boolean isEmpty = nonSystemTableCount == 0;
return isEmpty;

実際には...本当に信頼できる、本当に一般的なソリューションを得るには、かなり一生懸命働かなければならないかもしれません。

于 2008-09-23T04:12:04.963 に答える
0

Oracleでは、少なくともUSER_TABLESから選択して、システムテーブルを除外できます。

于 2008-09-23T05:24:28.783 に答える
0

同じ方法で作成されたデータベースを常にチェックしていますか? その場合は、使い慣れたテーブルのサブセットから簡単に選択してデータを探すことができる場合があります。

また、一見すると「データ」のように見えても、実際には用語の興味深い意味で「データ」ではない可能性がある、ルックアップ テーブルに追加される可能性のある静的データについても考慮する必要があるかもしれません。

あなたが取り組もうとしている特定の問題について、さらに情報を提供できますか? より多くのデータがあれば、よりシンプルで信頼できる答えが得られるのではないかと思います。

これらのデータベースを作成していますか?
毎回ほぼ同じコンストラクターでそれらを作成していますか? どのようなプロセスがこれらの人をぶらぶらさせ、そのコンストラクターは破壊できますか?

テーブルをループするメタ データ プロセスが確かに存在しますが、もう少しカスタムが存在する可能性があります。

于 2008-09-23T04:01:41.417 に答える