2017-04-26 18 views
0

を複製した後、私は、MySQL 5.7 のMyISAMテーブルTを持っている自動インクリメント値を取得する値xとyはINSERTキー

  • 考える すでにA = xの行がある場合は、私に返すB
  • それ以外の場合は、A = xかつC = yの行を挿入して返信するB

これを行う最も簡単な方法は、しかし、これは私がロックのいくつかの並べ替えを実装する必要があるだろうという意味、非アトミックである

SELECT B FROM T WHERE A=x; 
if the row doesn't exist, 
INSERT INTO T SET A=x, C=y; 
SELECT LAST_INSERT_ID(); 

のようです。

私は

INSERT IGNORE INTO T SET A=x, C=y; 
SELECT LAST_INSERT_ID(); 

を使用することができます願っていたが、INSERTは、重複キーでは無視されたときにBをLAST_INSERT_ID()返しません。

ロックなしでこれをアトミックに達成する簡単な方法はありますか?

+0

テーブルに既に存在するデータを使用していますか?挿入の無視は、プライマリキーを持つレコードを挿入するだけで、作業テーブルにプライマリキーが存在する場合はスキップします。 –

+0

@reds - 私はその状況でも自動インクリメントフィールドを返すことを期待していました。しかし、反射では、これはIGNOREがバイパスできるデータ行へのトリップを必要とするようです。 – Chap

+0

MyISAMの使用を中止してください。 InnoDBに切り替えます。 –

答えて

0

LAST_INSERT_ID()で実際に何かが挿入され、新しいIDが割り当てられている場合にのみ設定されるので、私はそれを行う方法はないと思います。あなたは、あなただけ挿入されたキーを選択する必要があります:

INSERT IGNORE INTO T SET a=x, C=y; 
SELECT B FROM T WHERE a = x; 
+0

はい。私はここで推測していますが、mySQLが最初にプライマリキーインデックスを参照し、重複したキー違反を検出し、自動インクリメント値が存在するデータ行をフェッチすることはないようです。 – Chap

+0

2つの別々のクエリです。 'INSERT'で重複を発見すると何もしません。' SELECT'は 'b'からその行の値を返します。 – Barmar

+0

私は不明でした:私はあなたの解決策に同意しています。なぜなら、(INSERTが重複を発見したとしてもLAST_INSERT_ID()が働くかもしれない)私の元の考え方はうまくいかないと推測しています。ごめんなさい! – Chap

-1
select max(id) from T 

テーブル

+0

複数のスレッドが実行されている場合、これは動作するとは限りません。 – Chap

+0

k私はそれに同意します –

関連する問題