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

时间:2013-01-11 11:19:09

标签: c# mysql

我必须将多个行更新到表中,如果表中不存在更新行,我需要插入该行。我不能使用唯一键,因此不能使用 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

6 个答案:

答案 0 :(得分:3)

您可以使用临时表。

  1. 将您的数据放入临时表
  2. 通过JOIN
  3. 更新“其他”表格
  4. 从临时表中删除匹配数据
  5. 将临时表中的剩余内容插入主表。
  6. 如果您有大量数据,这比按记录记录要快。

答案 1 :(得分:1)

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

if not exists (select 1 from Table  where column1  ='xxxxx' AND   column2='xxxxx')
        insert into Table ( column1,column2)
        values ( @xxxx,xxxxx)
else 
    update Table

答案 2 :(得分:0)

UPDATE <TABLE>
SET COLUMN1 = 'xxxx', COLUMN2 ...
WHERE COLUMN1 = ... AND COLUMN2 ...

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

如果并发可能成为问题,请确保在TRANSACTION ISOLATION LEVEL REPEATABLE READ中运行。

答案 3 :(得分:0)

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并不好。

答案 4 :(得分:0)

您可以使用EXISTS或查看子选择的计数(如果其>&gt; 0知道该行是否已存在

答案 5 :(得分:-1)

您可能会发现有用的REPLACE语句。其语法描述为here