什么是更新正确的/最快的方式在SQL /插入一条记录(火鸟/ MySQL的)
题
我需要一些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'
其他提示
有关的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},...),(...),...
鉴于:。的最好是避免替换约束工作时强>
不隶属于 StackOverflow