【问题标题】:Complex INSERT query复杂的 INSERT 查询
【发布时间】:2012-04-02 22:50:44
【问题描述】:

我对 MySQL 还是很陌生。我有两个相关的表,很常见的情况:Klients(KID, name, surname) 和 Visits(VID, VKID, dateOfVisit) - VKID 是 Klient ID。我对合适的 INSERT 查询有疑问,这就是我想要做的: 1.检查是否存在具有特定姓名和姓氏的客户(假设没有相同姓氏的人) 2.如果是,获取 ID 并执行 INSERT to Visits 表 3.如果没有,INSERT new Klient,获取 ID 和 INSERT to Visits。

是否可以在一个查询中完成?

【问题讨论】:

标签: java mysql database insert innodb


【解决方案1】:

您需要使用 IF EXIST / NOT EXISTS 并使用子查询来检查表。见参考bwlo

http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

HTH

【讨论】:

  • 这并没有给出解决方案
【解决方案2】:

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)。

【讨论】:

    【解决方案3】:

    试试这样的

    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”

    我尚未对其进行测试,但这是您想要完成的总体思路。

    【讨论】:

    • 它看起来适合我的需要,因为我收到 1064 错误[pre][code]IF NOT EXISTS(SELECT * FROM Klients WHERE surname='Smith') THEN INSERT INTO Klients(name,surname) 价值观('亚当','史密斯');否则插入Visits(VKID) SELECT KID FROM Klients WHERE surname='Smith';结束 IF;[/code][/pre]
    • 对不起,我不知道如何格式化我的评论中的一段代码,有点乱
    【解决方案4】:

    这些应该是事务中的两个查询:

    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:我忘了提到您需要在 (surname, name) 上添加唯一约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-16
      • 2013-06-28
      • 2012-09-28
      • 1970-01-01
      • 2012-07-13
      • 2013-05-22
      • 2017-06-20
      • 1970-01-01
      相关资源
      最近更新 更多