2

MySQL データベースには、と のtest2 つの列を持つfooテーブルがありますbar。そのような行がまだ存在しない場合にのみ行を挿入する単一の SQL ステートメントを作成しようとしています。次のことを試しましたが、テーブルが空の場合は機能しません。

INSERT INTO test (foo, bar) 
SELECT 'foo', 'bar'
FROM test
WHERE NOT EXISTS  
(SELECT 1 FROM test WHERE foo = 'foo' AND bar = 'bar')
LIMIT 1;
4

5 に答える 5

2

テスト テーブルは空なので、Select にはレコードが入りません。したがって、Dualtable with を使用しますSelect

    INSERT INTO test (foo, bar) 
    SELECT 'foo', 
           'bar' 
    From DUAL
    WHERE  NOT EXISTS (SELECT 1 
                       FROM   test  
                       WHERE  foo = 'foo' 
                              AND bar = 'bar') 

DUALSELECTこれは純粋に、すべてのステートメントFROMに他の句が必要な場合があることを必要とする人々の便宜のためです。MySQL は句を無視する場合があります。FROM DUALテーブルが参照されていない場合、MySQL は不要です。

于 2012-05-17T14:10:22.163 に答える
2

EXISTS句が選択元のテーブルを参照する必要はありませんSELECT。挿入ステートメントの外部参照のみを使用しているため、任意のテーブルを使用して選択できます。実際、使用する必要さえありませんコンクリートテーブルなど

INSERT INTO Test
SELECT  'foo', 'bar'
FROM    DUAL
WHERE   NOT EXISTS (SELECT 1 FROM test WHERE foo = 'foo' AND bar = 'bar');

SQL フィドルの例

于 2012-05-17T14:36:53.217 に答える
1

次のようなことを試しましたか?

SELECT      'foo'
            , 'bar'
WHERE       1 NOT IN  (
                SELECT  CASE WHEN COUNT(*) < 1
                            THEN 0
                            ELSE 1
                        END
                FROM    test
                WHERE   foo = 'foo'
                        AND bar = 'bar'
            )

の削除に注意してくださいLIMIT 1(これLIMIT 1は害があるとは思いませんが、句がサブクエリの外にあったため、どちらも役に立たないと思います)。

上記はテスト済みであり、空のテーブルに対して適切に機能することに注意してください。

また、上記の場合は、null以外のセット(またはのnullセット)が返された場合にtrueを返すだけでなく、IN必須です。EXISTSEXISTSNOT EXISTS

于 2012-05-17T14:39:03.360 に答える
0

挿入している同じテーブルから結果セットを挿入し、行が存在するかどうかを確認することはできないと思います。

とにかく、そうでない場合、ここに私が推測する回避策があります:

INSERT INTO test t1 (foo, bar) 
ON DUPLICATE KEY update t1.foo=t2.foo;

編集:元のクエリでは、選択ステートメントから挿入を行っていると思いました。どうやら、特定の手動タプルを挿入したいだけなので、提案を変更しました。テーブルが空でも機能するはずです。

于 2012-05-17T14:15:13.803 に答える
-1

REPLACE INTO既存のレコードを置き換えるか、存在しない場合は新しいレコードを作成するのに使用できます。このアプローチが機能するかどうかは、コンテンツの詳細によって異なります。

于 2012-05-17T14:11:52.113 に答える