【问题标题】:Conditional mySQL statement. If true UPDATE, if false INSERT条件 mySQL 语句。如果为真 UPDATE,如果为假 INSERT
【发布时间】:2011-02-09 00:47:54
【问题描述】:

我正在尝试创建更强大的MySQL 查询并在此过程中学习。目前我很难掌握ON DUPLICATE KEY 语法和可能的用途。

我有一个INSERT 查询,只有在没有具有相同ID 和名称的记录时,我才想INSERT,否则UPDATEID 和 name 不是 UNIQUEID 已编入索引。ID 不是 UNIQUE 因为它引用了另一个表中的另一条记录,我希望此表中有多个记录引用该特定记录来自另一张桌子。

我如何才能使用ON DUPLICATE KEYINSERT 仅当没有与该ID 的记录并且名称已经设置否则UPDATE 该记录?

我可以通过几个QUERIES 轻松实现这一点,然后让PHP 执行IF ELSE 部分,但我想知道如何LIMIT 我发送给QUERIES 的数量MySQL.

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    更新:请注意,您需要使用 IF EXISTS 而不是原始答案中所示的 IS NULL

    用于创建存储过程以封装所有逻辑并检查 Flavors 是否存在的代码:

    DELIMITER //
    
    DROP PROCEDURE `GetFlavour`//
    CREATE PROCEDURE `GetFlavour`(`FlavourID` INT, `FlavourName` VARCHAR(20))
    BEGIN
    IF EXISTS (SELECT * FROM Flavours WHERE ID = FlavourID) THEN
    UPDATE Flavours SET ID = FlavourID;
    ELSE
    INSERT INTO Flavours (ID, Name) VALUES (FlavourID, FlavourName);
    END IF;
    END //
    
    DELIMITER ;
    

    原文:

    您可以使用此代码。它将检查特定记录是否存在,如果记录集为 NULL,则它将通过并为您插入新记录。

    IF (SELECT * FROM `TableName` WHERE `ID` = 2342 AND `Name` = 'abc') IS NULL THEN
    INSERT INTO `TableName` (`ID`, `Name`) VALUES ('2342', 'abc');
    ELSE UPDATE `TableName` SET `Name` = 'xyz' WHERE `ID` = '2342';
    END IF;
    

    我对我的 MySQL 语法有点生疏,但该代码至少应该能让你大部分时间到达那里,而不是使用 ON DUPLICATE KEY。

    【讨论】:

    • 出现错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'IF (SELECT * FROM flavor WHERE id = '1' AND Name = 'BerryBlue') IS NULL THEN ' 附近使用正确的语法
    • @Vitaliy - 我已经更新了我的代码。看看这是否对你有帮助。如果不是,请尝试将 INSERT 语句与 IF 语句放在同一行。
    • 已经试过了。也颠倒了逻辑,仍然给我一个语法错误。我什至没有运气用静态值替换所有 PHP 变量。
    • @Vitaliy - 我添加了另一个有效的代码 sn-p(我比平时多测试了几次以确保)。
    • 您必须在 MySQL 函数或过程中使用 IF/ELSE,它不像常规查询那样工作。
    【解决方案2】:

    id 和 name 不是唯一的,但 id 是 索引。 id 不是唯一的

    如何使用 ON DUPLICATE KEY 来 仅当没有记录时才插入 该 id 和 name 已设置其他 更新那条记录?

    你不能。 ON DUPLICATE KEY UPDATE 需要唯一键或主键来确定要更新的行。你最好让 PHP 做 IF ELSE 部分。

    编辑:

    如果 name 和 id 的组合应该是唯一的,您可以创建一个多列 UNIQUE 索引。从那里您可以使用 ON DUPLICATE KEY UPDATE。

    【讨论】:

    • +1 用于解释这一事实。听起来他有一个自动递增的 id 列。在这种情况下,他只需要选择然后插入到事务中。
    • 那么这样我就需要两个查询。一个用于选择字段,然后另一个用于更新/插入。我想看看我是否可以在一个查询中做到这一点。我没有自动增加 id 列。 id 是指另一个表上另一个记录的唯一 id。
    • 不幸的是没有唯一索引,我认为你不能。 MySQL 在内部首先尝试插入,然后捕获“重复键错误”,然后进行更新。 REPLACE 的工作方式相同。听起来可能 id 和 name 结合起来可以组成一个 UNIQUE 索引?如果是这样,则创建该组合索引和 ON DUPLICATE KEY 应该适合您。
    【解决方案3】:

    为什么不只使用存储过程,然后您可以嵌入所有逻辑,加上您可以在其他应用程序中使用的可重用代码(例如存储过程)。最后,这只需要往返服务器一次即可调用存储过程。

    【讨论】:

    • 我对 SQL 非常陌生,不知道如何制作存储过程。我有很多东西要学。
    猜你喜欢
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2023-03-31
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多