【问题标题】:MySQL - Select where fields exist, rows, if not insertMySQL - 选择字段存在的位置,行,如果不插入
【发布时间】:2012-01-24 18:22:24
【问题描述】:

我想在一个查询中完成以下所有操作:

给定一些数据地址、城市、州、邮编。我想查看用户是否已经存在该数据,如果不存在则插入新记录。如果是这样,只需更新修改日期即可。

  1. SELECT user_id FROM userInfo WHERE Address = '123 Main ST' AND City = 'New York' AND State='NY' AND Zip = '12345'

  2. 如果计数大于 0...

  3. UPDATE userInfo SET modifiedDate = '' WHERE user_id = 选择的用户 ID

  4. Else If count 为 0

  5. INSERT INTO userInfo (Address, City, State, Zip) VALUES ('123 Main ST', 'New York', 'NY', '12345')

我想指出,Address 和 City 以及 State 和 Zip 字段不是任何类型的键,因此 REPLACE 不起作用。另外,如果确实存在,我想在不同的查询中添加其他数据。

【问题讨论】:

    标签: mysql insert insert-update


    【解决方案1】:

    在这种情况下,你不能。 REPLACE 用于插入或更新,它是唯一可以同时执行这两种操作的语句。但它需要唯一的键。

    如果您的过滤器不是唯一键,即使您编写单独的语句,您也无法知道应该更新哪些匹配行。

    如果它唯一键,你应该在它上面添加一个唯一索引,你就可以使用REPLACE了。

    长话短说:确定您的密钥并更新您的索引。

    【讨论】:

    • 不能先运行一个 select 然后运行一个 if 语句吗?您可以在存储过程中执行此操作,但为什么不能在单个查询中执行?
    • 查询是一种语句。存储过程可以包含一系列语句,其中有一个查询。但是一个查询本身不能是多个语句,因为它是一个。停车场可以停放汽车,但汽车不能。
    【解决方案2】:

    要选择运行两个不同的查询,您需要使用存储过程。试试这个:

    CREATE PROCEDURE sp_UpdateIfNotExists()
    BEGIN
    DECLARE the_user_id INT; /* or whatever your data type is */
    SELECT user_id
        INTO the_user_id
    FROM userInfo 
    WHERE Address = '123 Main ST' AND City = 'New York' AND State='NY' AND Zip = '12345'
    CASE
        WHEN the_user_id IS NULL INSERT INTO userInfo (Address, City, State, Zip) VALUES ('123 Main ST', 'New York', 'NY', '12345');
        ELSE UPDATE userInfo SET modifiedDate = '' WHERE user_id = the_user_id
    END
    

    然后执行存储过程(使用CALL sp_UpdateIfNotExists)。您可以使用参数等自定义它,我在 PHP Web 应用程序中使用这些。

    【讨论】:

      【解决方案3】:

      即使要使 SELECT 高效,您也需要(州、市、地址)上的索引。为了数据的一致性,索引应该应用 UNIQUE 约束。

      对于现有行的部分更新,有 MySQL 特定的扩展:INSERT ... ON DUPLICATE KEY UPDATE

      要知道受影响的现有行的 id,您可以在 INSERT 的 UPDATE 子句中使用 LAST_INSERT_ID(expr),然后读取通常的 LAST_INSERT_ID() 或其等效项的值。

      【讨论】:

        猜你喜欢
        • 2018-02-16
        • 2020-02-04
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 2014-03-31
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        相关资源
        最近更新 更多