2011-06-27 12 views
3

私のMySQLテーブルに一意にデータを挿入したいと思います。つまり、同じエントリ(すべての列に同じ値が含まれている)がすでにテーブルに存在する場合は、挿入操作を終了する必要があります。これは一意のキーを定義し、今後のエラーを処理することで簡単に行うことができますが、テーブル構造を変更することはできません。ユニークなキーなしでMySQLテーブルに一意に挿入

私は、ユニークなキーのないテーブルでもこれをキャッチする簡単な方法があると確信しています。もちろん、私は手動でSELECTステートメントを使ってそのようなレコードの存在をチェックすることができますが、その間に(SELECTのチェックと実際のINSERTのチェックの間に)自分のテーブルを変更する同時インスタンスが存在する可能性があります。

1つのSQLコマンドでチェックとINSERTの操作を実行したいと思います。誰かが私を正しい方向に向けることができますか?

+0

テーブルにキーを使用していますか? 「重複キーに挿入」を使用することができます。 @dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – Tim

+0

@Timこれは一意のキーを必要とし、@BjörnMarschollekはそのようなキーを追加できないと言います。 –

+0

なぜあなたはこれを行うための最良の方法は、テーブルを変更することはできません。他の方法はハックです。ロックが達成されてロックが解放された後にクエリが実行されている間に何か悪いことが起こった場合、それ以外に何も挿入できません。 – mikeq

答えて

4

は、私たちは、あなたに5列を持っていると仮定しましょうテーブル - col1、col2、col3、col4、col5。そして、あなたが挿入しようとしているこれらの列に対応するデータは、$ col1、$ col2、$ col3、$ col4、$ col5の変数にあると仮定します(私はPHPをあなたの言語と仮定していますが、あなたの命名法)。

だからあなたの挿入は次のようになります。

INSERT INTO `tableA` (`col1`, `col2`, `col3`, `col4`, `col5`) 
SELECT $col1, $col2, $col3, $col4, $col5 
FROM `tableA` 
WHERE NOT EXISTS (SELECT 1 
    FROM `tableA` 
    WHERE `col1` = $col1 
    AND `col2` = $col2 
    AND `col3` = $col3 
    AND `col4` = $col4 
    AND `col5` = $col5); 

別の方法としては、次のようになります。

INSERT INTO `tableA` (`col1`, `col2`, `col3`, `col4`, `col5`) 
SELECT $col1, $col2, $col3, $col4, $col5 
FROM `tableA` 
WHERE `col1` = $col1 
AND `col2` = $col2 
AND `col3` = $col3 
AND `col4` = $col4 
AND `col5` = $col5 
HAVING COUNT(1) = 0; 

は、この情報がお役に立てば幸いです。

0

クエリでテーブルロックを使用することができます。クエリが処理を終了するまで、他のプロセスはそれを変更しません。あなたは事前にSELECT文を使用して 「そのような記録を言ったが、とチェックの間、その間に私のテーブルを変更同時インスタンス(があるかもしれないとして、その後 http://www.mssqlcity.com/Articles/Adm/SQL70Locks.htm

と実行します。このリンクは

チェックSELECTと実際のINSERT)。 "一意の行を確保するための一意のキーの唯一の方法は、テーブルの上に任意の書き込みの同時実行を許可されていませんがなければ

+2

この記事はMSSQLについてのものであり、QはMySQL用です –

+0

テーブルが永遠にロックされないようにするためには厳密なテストが必要です。また、 'SELECT' +' INSERT 'は何時間もテーブルをブロックしていません。 –

0

(どちらかそれらをロックしたりserialisable分離レベルを使用して)

関連する問題