2012-03-17 125 views
0

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

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

+0

听起来不像一个查询。 – Randy 2012-03-17 20:30:34

+0

也许交易? – user1091733 2012-03-17 20:32:08

+0

有一个相关的问题,也许这可能有帮助 http://stackoverflow.com/questions/4940283/conditional-mysql-statement-if-true-update-if-false-insert – gastonfartek 2012-03-17 20:47:37

回答

1

INSERT语句只允许一个单一的目标表中的参考。

因此,除非使用触发器或存储过程,否则查找的查询是不可能的。

但是,这种问题是使用休耕小算法通常解决:

1)插入在表中的记录[访问]假定父记录并在表中存在[Klients]

INSERT INTO Visits (VKID, dateOfVisit) 
SELECT KID, NOW() 
FROM Klients 
WHERE ([email protected]) AND ([email protected]) 

2)查询后查询插入的记录数(1)

3)如果没有记录被插入,则添加一个新的记录表[Klients],然后再次运行(1)。

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; 

没有需要指定

我没有测试过二次插入“价值”,但这是你正在尝试的总体思路完成。

+0

它看起来像它适合我的需要,由我收到1064错误[上一页] [代码] IF NOT EXISTS(SELECT * FROM'Klients' WHERE'surname' ='史密斯)THEN INSERT INTO'Klients'('name','surname')VALUES( '亚当', '史密斯'); ELSE INSERT INTO'Visits'('VKID') SELECT'KID' FROM'Klients' WHERE'surname' = '史密斯'; END IF; [/代码] [/预] – user1091733 2012-03-17 22:14:59

+0

对不起,但我无法弄清楚如何在我的注释格式的代码,这是一个有点乱 – user1091733 2012-03-17 22:22:13

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的目的,功能完全相同intented(),其中明确通过的值被存储用于获取之后的值。

UPD:我忘记提及您需要添加一个唯一的约束(姓,名)。