我有两个表,一个具有简单的“客户端”数据,另一个具有客户端的“状态”。我在两个表中都有一个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不是一个好主意,因为它是一个如此大的数字,随着表的增长会减慢速度。
答案 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,或者您正在使用的客户端库中的任何函数。