13

JavaDBとも呼ばれるApache Derbyを試してみます。既に存在する可能性のあるレコードを挿入するときに、重複キーの問題を回避できないようです。" " または " " に相当する Derby はありますか? insert if not existsmerge

同様に、「 」のようなことをする方法はありdrop table foo if existsますか?

4

7 に答える 7

16

私は apache derby を使用したことがありませんが、データベースにかなり依存しない一般的なソリューションは次のとおりです。

値 'a' および 'b' をテーブル foo (A、B という名前の列) に挿入するには、値がまだ存在しない場合にのみ、次のようにします。

INSERT INTO foo (  
  SELECT 'a' as A, 'b' as B
  FROM foo  
  WHERE  
    A = 'a' AND B = 'b'  
  HAVING count(*)=0  
 )

これは特定の dbms に合わせて微調整する必要があるかもしれませんが、アイデアは、値がない場合にのみ値を返す選択の結果を挿入することです。

これは、べき等な sql スクリプト (2 回目の実行では何もしないスクリプト) を作成するための便利なトリックです。HAVING count(*)=0ただし、大規模なテーブルでは非常に遅くなる可能性があるため、本番コードでこれを使用する場合は注意してください。

于 2009-01-10T12:56:26.463 に答える
4

SQL:2003 MERGE ステートメントをサポートするリクエストは、Derby バグ トラッカーにhttps://issues.apache.org/jira/browse/DERBY-3155として記録されます。

あなたはその問題に投票するか、実装に貢献することができます!

それ以外の場合、私が知っている唯一の解決策は、他の人が指摘したように、最初に行を選択して存在するかどうかを確認するか、挿入して例外をキャッチすることです。

このロジックをデータベース プロシージャにパッケージ化して、実行を多少簡単にすることができます。

于 2009-10-21T04:12:06.900 に答える
3

私がPostgreSQLDBで使用した標準的な方法は、次のようなものです。

INSERT INTO foo ( col1, col2, col3, ... )
SELECT 'col1 value', 'col2 value', 'colc value', ...
WHERE NOT EXISTS (
  SELECT 0
  FROM foo
  WHERE col1 = 'col1 value'
  ...
)

ただし、移植性が高いか、ANSIに厳密に準拠しているかはわかりません。外側のSELECTステートメントに欠落しているFROM句は、特に非標準である可能性があります。でもやってみてください。

于 2009-04-01T14:13:07.553 に答える
2

Derby は 10.11 で MERGE を実装しました: https://db.apache.org/derby/docs/10.11/ref/rrefsqljmerge.html
DB を使用する前に 10.11 にアップグレードする必要があることに注意してください: https://db.apache.org /derby/docs/10.11/devguide/cdevupgrades.html

于 2014-08-31T07:18:25.720 に答える
1

私は同じ問題を抱えていました.Derbyで値/列が1つだけの挿入でこれが機能しました. (私はそれをもっとテストすることはできませんでしたが、そうすべきではないと仮定する理由はありません):

INSERT INTO my_table (my_column)
    (SELECT 'new_value_to_insert'
    FROM my_table
    WHERE my_column = 'new_value_to_insert' 
    HAVING count(*)=0)
于 2010-03-16T22:05:28.610 に答える
0

これに対するネイティブ サポートはありません。それを回避するために、Eclipse リンクを使用しています。Eclipse リンクは、テーブルを作成しようとし、既存のテーブルを作成しようとして発生したエラーを無視します。

スキーマを変更する場合は、テーブルを作成する前に削除するようにEclipseリンクに指示できます。

于 2009-07-27T22:10:03.983 に答える
0

私はこのソリューションを使用していますが、データベース ビューからの複製とユーザー ビューからの複製の違いを理解している場合にのみ使用する必要があります。

  • データベース ビューからの重複は、同じ主キーを持つ 2 つのレコードです
  • ユーザー ビューからの重複は、すべてのフィールドが同一の 2 つのレコードです

        while (ResultSet.next()) {
        try {
        PreparedStatement insertion = myConn.prepareStatement("insert into table values (?)");
        insertion .setString(1, "test");
        insertion .executeUpdate();           
        } catch (SQLException e) {
            if(e.getSQLState().equals("23505"))//Found duplicate from database view
             {continue;}//ignore duplicate and continue with the insert statement
            else{try {                           
                  throw e;
            } catch (Exception ex) {  
                }
              }
            }
          }
    
于 2009-09-29T08:52:19.390 に答える