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

时间:2011-12-20 20:14:56

标签: mysql insert insert-update

我想在ONE QUERY中执行以下所有操作:

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

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

  2. 如果count大于0 ......

  3. UPDATE userInfo SET modifiedDate = '' WHERE user_id = SELECTED user_id

  4. 否则如果count为0

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

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

3 个答案:

答案 0 :(得分:0)

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

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

如果唯一键,则应在其上添加唯一索引,并且您将能够使用REPLACE。

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

答案 1 :(得分:0)

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

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应用程序中使用它们。

答案 2 :(得分:0)

即使SELECT效率很高,您也需要一个索引(状态,城市,地址)。对于数据一致性,索引应该应用UNIQUE约束。

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

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