复杂的INSERT查询

时间:2012-03-17 20:28:02

标签: java mysql database insert innodb

我是MySQL的新手。我有两个相关的表,很常见的情况:Klients(KID,姓名,姓氏)和访问(VID,VKID,dateOfVisit) - VKID是Klient ID。我有一个合适的INSERT查询问题,这是我想要做的: 1.检查是否存在具有特定姓名和姓氏的Klient(假设没有姓氏相同的人) 2.如果是,请获取ID并执行INSERT to Visits表 3.如果没有,请插入新的Klient,获取ID并插入访问。

是否可以在一个查询中执行?

4 个答案:

答案 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:我忘了你需要在(姓氏,姓名)上添加一个独特的约束。