4

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

4

5 回答 5

3

您可以使用临时表。

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

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

于 2013-01-11T11:25:34.420 回答
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
于 2013-01-11T11:27:38.183 回答
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 并不好。

于 2013-01-11T11:32:06.547 回答
0

您可以使用EXISTS或检查子选择的数量(如果它 > 0)以了解该行是否已经存在

于 2013-01-11T11:32:30.133 回答
-1

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

于 2013-01-11T11:22:28.183 回答