MySQL-选择字段存在的位置、行,如果不是插入

MySQL-选择字段存在的位置、行,如果不是插入,mysql,insert,insert-update,Mysql,Insert,Insert Update,我想在一个查询中完成以下所有操作: 给定一些数据地址、城市、州、邮政编码。我想看看是否有用户已经存在该数据,如果没有,则插入一条新记录。如果是这样的话,只需更新上面修改的日期即可 从userInfo中选择用户id,其中地址为'123 Main ST',城市为'New York',州为'NY',邮政编码为'12345' 如果计数大于0 更新用户信息集modifiedDate='',其中用户id=所选用户id 否则,如果计数为0 插入userInfo(地址、城市、州、邮政编码)值('123 Main

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

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

  • 从userInfo中选择用户id,其中地址为'123 Main ST',城市为'New York',州为'NY',邮政编码为'12345'

  • 如果计数大于0

  • 更新用户信息集modifiedDate='',其中用户id=
    所选用户id

  • 否则,如果计数为0

  • 插入userInfo(地址、城市、州、邮政编码)值('123 Main ST','New York','NY','12345')


  • 我想指出的是,地址、城市、州和邮编字段不是任何类型的键,因此替换将不起作用。另外,如果确实存在其他数据,我希望在另一个查询中添加这些数据。

    在这种情况下,您无法添加这些数据。REPLACE用于插入或更新,它是唯一可以同时执行这两项操作的语句。但它需要独特的钥匙

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

    如果它是一个唯一的键,您应该在它上面添加一个唯一的索引,并且您可以使用REPLACE


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

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

    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
    

    然后只需执行存储过程(使用
    调用sp_UpdateIfNotExists
    )。您可以使用参数等对其进行自定义,我在PHP web应用程序中使用这些参数。

    即使要使SELECT有效,您也需要索引(州、城市、地址)。为了数据一致性,索引应应用唯一约束

    对于现有行的部分更新,有MySQL特定的扩展:
    INSERT。。。在重复密钥更新时


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

    不能先运行select,然后再运行if语句吗?可以在存储过程中执行,但为什么不在单个查询中执行呢?查询是一种语句。存储过程可以包含一系列语句,其中包括一个查询。但是查询本身不能是多个语句,因为它是一个语句。停车场可以容纳汽车,但汽车不能。