2

単純な「クライアント」データを持つテーブルと、クライアントの「状態」を持つテーブルの 2 つのテーブルがあります。両方のテーブルに ID の外部キーがあります。

表 A:
Id (int) PK AI
ClientId (bigint) UN PK
LastContact (datetime)

テーブル B:
Id (int) PK テーブル A への外部キー Id
他の列....

「クライアント」テーブルに挿入/更新するとき、テーブル ID ではなく ClientId に依存しています。

INSERT INTO client (ClientId, ClientType, LastContact) Values (Client_Id, Client_Type, Last_Contact) ON DUPLICATE KEY 
UPDATE ClientType=Client_Type, LastContact=Last_Contact;

挿入または更新した ID を確認して、2 番目のテーブルを挿入/更新できるようにするにはどうすればよいですか。外部キーとリンクするとこれが簡単になると思いましたが、方法が見つからないようです。また、ID に ClientId を使用することはお勧めできません。これは非常に大きな数であり、テーブルが大きくなるにつれて速度が低下するためです。

4

1 に答える 1

2

mysql マニュアルには、正確な状況をカバーするスニペットがあります。

テーブルに AUTO_INCREMENT 列が含まれていて、INSERT ... UPDATE が行を挿入する場合、LAST_INSERT_ID() 関数は AUTO_INCREMENT 値を返します。代わりにステートメントが行を更新する場合、LAST_INSERT_ID() は意味がありません。ただし、LAST_INSERT_ID(expr) を使用してこれを回避できます。id が AUTO_INCREMENT 列であるとします。LAST_INSERT_ID() を更新に意味のあるものにするには、次のように行を挿入します。

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

したがって、あなたの場合、クエリを次のように修正するだけです。

INSERT INTO client (ClientId, ClientType, LastContact) Values 
(Client_Id, Client_Type, Last_Contact) ON DUPLICATE KEY 
UPDATE ClientType=Client_Type, LastContact=Last_Contact, 
ClientId = LAST_INSERT_ID(ClientId);

その後、LAST_INSERT_ID()、または使用しているクライアント ライブラリの任意の関数で追加/更新された行の ID を取得できます。

于 2013-03-20T17:31:41.287 に答える