2

我有两张表,一张有简单的“客户”数据,另一张有客户的“状态”。我在两个表中都有一个 ID 的外键。

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

表 B:
Id (int) PK 表 A 的外键 Id
其他列....

当我插入/更新到我的“客户”表时,我依赖的是 ClientId,而不是表 ID,就像这样。

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

我如何知道我已插入或更新的 ID,然后才能插入/更新我的第二个表。我认为用外键链接会使这更容易,但我似乎找不到办法。另外,有人告诉我使用 ClientId 作为我的 Id 不是一个好主意,因为它是一个很大的数字,并且会随着表的增长而减慢速度。

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 回答