我想在ONE QUERY中执行以下所有操作:
给出一些数据地址,城市,州,邮编。我想查看用户是否已存在该数据,如果没有,则插入新记录。如果是这样,只需更新修改日期。
SELECT user_id FROM userInfo WHERE Address = '123 Main ST' AND City = 'New York' AND State='NY' AND Zip = '12345'
如果count大于0 ......
UPDATE userInfo SET modifiedDate = '' WHERE user_id =
SELECTED user_id
否则如果count为0
INSERT INTO userInfo (Address, City, State, Zip) VALUES ('123 Main ST', 'New York', 'NY', '12345')
我想指出Address和City以及State和Zip字段不是任何类型的键,因此REPLACE不起作用。另外,如果确实存在,我还想在其他查询中添加其他数据。
答案 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()或其等效值。