MySQL插入外键使用ID的多个表

时间:2013-03-20 17:25:11

标签: mysql insert foreign-keys

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

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

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

当我插入/更新到我的'客户'表时,我依赖于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不是一个好主意,因为它是一个如此大的数字,随着表的增长会减慢速度。

1 个答案:

答案 0 :(得分: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表(a,b,c)VALUES(1,2,3)在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,或者您正在使用的客户端库中的任何函数。