2013-01-11 97 views
4

如果表中不存在更新行,我需要将该行的行数更新为一个表。我不能用独有的关键,因此与没有使用上的重复密钥更新如果行存在,则执行更新否则请插入

我一定要实现这样的事情

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 

这是一个高性能的application.Any想法?代码级或查询级

FYI:数据库为MySQL

回答

-1

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

+0

更换采用唯一性主键匹配现有记录 –

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

您可以使用临时表。

  1. 把你的数据到临时表
  2. 通过JOIN做了“等”表的更新
  3. 从临时表中删除匹配的数据
  4. 从临时表中插入剩余的东西进入主表。

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

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 
+0

宕通过30秒打我: )你为什么不首先存在的任何原因?我认为更新是一个更常见的情况。 – Destrictor

+0

:)要成为我们没有“其他”部分,我们要么插入或不插入,所以回答你的问题:是的,如果是另一种方式,可能会更好:) –

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不好与多张查询插入/更新用的情况。

0

您可以使用EXISTS或检查子的cound选择如果> 0知道,如果该行媒体链接存在

相关问题