繁体   English   中英

如果存在行则执行更新,否则执行insert

[英]Execute update if row exists else do insert

我必须将多个行更新到表中,如果表中不存在更新行,则需要插入该行。 我不能使用唯一键,因此不能使用ON复制KEY UPDATE

我必须实现这样的目标

DECLARE count DOUBLE;
SELECT count(uid) 
INTO   count 
FROM   Table 
WHERE  column1  ='xxxxx'
 AND   column2='xxxxx';

IF (count=0)
THEN
    --peform insert
ELSE
    --perform update
END IF

这是一个高性能的应用程序。任何想法? 代码级别或查询级别

仅供参考:数据库是Mysql

您可以使用临时表。

  1. 将您的数据放入临时表中
  2. 通过JOIN更新“其他”表
  3. 从临时表中删除匹配的数据
  4. 将临时表中的剩余内容插入主表。

如果您有大量数据,这将比按记录记录更快。

这就是我们使用的商店程序,也可能适合您。

if not exists (select 1 from Table  where column1  ='xxxxx' AND   column2='xxxxx')
        insert into Table ( column1,column2)
        values ( @xxxx,xxxxx)
else 
    update Table
UPDATE <TABLE>
SET COLUMN1 = 'xxxx', COLUMN2 ...
WHERE COLUMN1 = ... AND COLUMN2 ...

IF @@ROWCOUNT = 0
   INSERT INTO <TABLE> (COLUMN1, ...)
   VALUES ('xxxx', ...)

如果并发可能是一个问题,请确保在TRANSACTION ISOLATION LEVEL REPEATABLE READ运行。

BEGIN TRAN
IF EXISTS ( SELECT  *
        FROM Table WITH ( UPDLOCK, SERIALIZABLE )
        WHERE CONDITION) 
BEGIN
    UPDATE Table SET SOMETHING WHERE CONDITION
END
ELSE 
BEGIN
    INSERT INTO Table(Field1,....) VALUES  (Value1,..... )
END
COMMIT TRAN

注意:事务非常好,但在使用多个查询进行插入/更新时使用IF EXISTS并不好。

你可以使用EXISTS或检查sub select的cound,如果它> 0,知道该行是否已经存在

您可能会发现有用的REPLACE语句。 它的语法在这里描述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM