我是MySQL的新手。我有两个相关的表,很常见的情况:Klients(KID,姓名,姓氏)和访问(VID,VKID,dateOfVisit) - VKID是Klient ID。我有一个合适的INSERT查询问题,这是我想要做的: 1.检查是否存在具有特定姓名和姓氏的Klient(假设没有姓氏相同的人) 2.如果是,请获取ID并执行INSERT to Visits表 3.如果没有,请插入新的Klient,获取ID并插入访问。
是否可以在一个查询中执行?
答案 0 :(得分:1)
您需要使用IF EXIST / NOT EXISTS并使用子查询来检查表。参见参考资料bwlo
http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html
HTH
答案 1 :(得分:1)
INSERT语句只允许一个目标表。
因此,除非您使用触发器或存储过程,否则您正在寻找的查询是不可能的。
但这种问题通常使用以下的小算法来解决:
1)在表[Visits]中插入一条记录,假设表中存在父记录[Klients]
INSERT INTO Visits (VKID, dateOfVisit)
SELECT KID, NOW()
FROM Klients
WHERE (name=@name) AND (surname=@surname)
2)在查询(1)
之后检查插入记录的数量3)如果没有插入记录,则添加新的记录表[Klients],然后再次运行(1)。
答案 2 :(得分:1)
尝试这样的事情
IF (SELECT * FROM `sometable` WHERE name = 'somename' AND surname = 'somesurname') IS NULL THEN
INSERT INTO Table1(name,surname) VALUES ('somename', 'somesurname');
ELSE INSERT INTO visits(kid,name,surname)
SELECT kid, name, surname FROM Table1 WHERE name = 'somename' AND surname = 'somesurname';
END IF;
无需在第二个插页
上指定'VALUES'我没有测试过,但这是你想要完成的一般想法。
答案 3 :(得分:1)
这些应该是交易中的两个查询:
INSERT INTO Klients (name, surname)
VALUES ('John', 'Doe')
ON DUPLICATE KEY UPDATE
KID = LAST_INSERT_ID(KID);
INSERT INTO Visits (VKID, dateOfVisits)
VALUES (LAST_INSERT_ID(), NOW());
第一个语句是一个upsert语句,其中更新部分使用的内容并不广为人知,但完全是为了LAST_INSERT_ID()的目的功能,其中存储了显式传递的值以便以后获取值。
UPD:我忘了你需要在(姓氏,姓名)上添加一个独特的约束。