1

私はこのテーブルを持っています:

create table comment_check (
record_id int ( 10 ) unique not null AUTO_INCREMENT ,
member_id int (10) not null unique , 
has_question_comment bool ,
has_business_comment bool 
);

そして、このアップサート:

INSERT INTO comment_check
(member_id , has_question_comment )
VALUES
(4815162342, 1 )
ON DUPLICATE KEY UPDATE
has_question_comment = 1

しかし、私が混乱しているのは、 record_id と実際のキーである member_id の 2 つのキーがあることです。テーブルを作成するとき、member_id 列をキーとしてラベル付けする必要がありますか? また、クエリ内の 2 つのキー (member_id と record_id) を区別するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

1

それらを区別する必要はありません。

「重複キー」例外をスローするキーは、MySQL が更新に使用するキーになります。

あなたの場合、record_id列に値を提供しておらず、その列が AUTO_INCREMENT として定義されているため、MySQL はその列に一意の値を生成します。したがって、ステートメントが record_id 列で「重複キー」例外を引き起こす可能性はありません。

重複キー例外をスローするのは「member_id」列になるため、MySQL は次と同等の更新を実行します。

UPDATE comment_check
   SET has_question_comment = 1
 WHERE member_id = 4815162342

実際、値が INT の最大値を超えている場合、ステートメントで member_id に指定された値は 2147483647 として解釈される可能性があります。


より一般的なケースでは、どちらかの列が重複キー例外をスローします。

INSERT INTO comment_check (record_id, member_id) VALUES (101,1111),(202,2222);

INSERT INTO comment_check (record_id, member_id) VALUES (101,2222)
  ON DUPLICATE KEY UPDATE has_question_comment = 1

2つの列のいずれかが「重複キー」例外をスローする可能性があります。動作(AFAIK)は、どの行が更新されるかについて明確に定義されていません。

   ... WHERE record_id = 101

-また-

   ... WHERE member_id = 2222

どのエラーが最初にスローされるかによると思います。また、MySQL 仕様 (AFAIK) では、これらの一意の制約がチェックされる順序を指定していません。(ストレージエンジンによって異なる場合があります。)

于 2013-01-18T16:45:46.957 に答える