を複製した後、私は、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()
返しません。
ロックなしでこれをアトミックに達成する簡単な方法はありますか?
テーブルに既に存在するデータを使用していますか?挿入の無視は、プライマリキーを持つレコードを挿入するだけで、作業テーブルにプライマリキーが存在する場合はスキップします。 –
@reds - 私はその状況でも自動インクリメントフィールドを返すことを期待していました。しかし、反射では、これはIGNOREがバイパスできるデータ行へのトリップを必要とするようです。 – Chap
MyISAMの使用を中止してください。 InnoDBに切り替えます。 –