什么是更新正确的/最快的方式在SQL /插入一条记录(火鸟/ MySQL的)

StackOverflow https://stackoverflow.com/questions/343562

  •  19-08-2019
  •  | 
  •  

我需要一些SQL数据库中更新记录,如果它存在,并且将其插入时不,看着周围还有看起来是这个几种解决方案,但我不知道什么是正确的/接受的方式来做到这一点。

我会非常喜欢它在两个火鸟2和MySQL 5个工作作为更新将需要对两个数据库进行运行,并且它会更简单如果同一SQL上都跑了,如果它的工作更多的数据库,它会优先。

速度和可靠性也因素,超速可靠性在这种情况下却会潜在地被用于更新1000的记录的快速连续(在不同的表)。

任何subjections?

有帮助吗?

解决方案

您应该要么使用是这样的:

BEGIN TRANSACTION
IF EXISTS (SELECT * FROM the_table WHERE pk = 'whatever')
    UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'
ELSE
    INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')
COMMIT

或者这一点,但分别发送它们,并忽略从插入任何错误约违反主关键字约束:

INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')

UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'

其他提示

在火鸟2.1可以使用更新或插入对于简单的情况下,或 MERGE 获得更加复杂的场景。

有关的MySQL,尝试REPLACE命令: HTTP:// dev的.mysql.com / DOC / refman / 5.0 / EN / replace.html

(请参见在此答案由米兰Babuskov对火鸟当量的注释。)

在火鸟2.1,然后才可以使用该方法棘手:

insert into table (id, a, b, c) values (:id, :a, :b, :c)
when SQLCODE -803 
do
begin
  update table set a = :a, b = :b, c = :c where id = :id;
end;

REPLACE作品酷似INSERT,不同之处在于,如果旧的行表中的具有相同的值作为用于主键或唯一索引的新行,旧的行被新的行插入之前删除。

语法:

REPLACE [LOW_PRIORITY |延迟]     [INTO] tbl_name [(COL_NAME,...)]

{ VALUES | VALUE} 

({expr | DEFAULT},...),(...),...

鉴于:。的最好是避免替换约束工作时

scroll top