Вставить или обновить в SQL - PullRequest
2 голосов
/ 17 сентября 2011

Представьте себе таблицу, которая отображается из строки в два целых числа. Я хотел бы либо вставить новую строку, если ключ отсутствует в таблице, либо обновить существующую строку, сложив целые числа (key, oldx+x, oldy+y). Я буду делать это много, и мне интересно, смогу ли я сделать это за одну операцию вместо сначала SELECT, чтобы проверить, существует ли строка, а затем INSERT или UPDATE с суммой, поскольку это, вероятно, приведет к двум поиск.

Я новичок в SQL и не могу понять, как это сделать эффективно.

Ответы [ 4 ]

4 голосов
/ 17 сентября 2011

SQLite поддерживает INSERT OR REPLACE, который необходимо использовать с большей осторожностью, чем думает большинство людей. См. этот SO-ответ для получения подробной информации и помните о возможности каскадного удаления во время замены.

2 голосов
/ 17 сентября 2011

Выполнение обоих будет работать:

UPDATE TABLE SET x=x+?, y=y+? WHERE key = ?; -- will do nothing if key not found

INSERT INTO TABLE (key, x, y)
SELECT ?, ?, ?
WHERE NOT EXISTS (SELECT * FROM TABLE WHERE key = ?); -- will do nothing if key found

Только один из них повлияет на данные в вашей таблице.

1 голос
/ 17 сентября 2011
-- Insert record with key=k if it does not exist yet.
-- the zero's could also be handled by appropiate defaults for oldx,oldy 
INSERT INTO tab (key, oldx, oldy) select k,0,0 
    WHERE NOT EXISTS (SELECT 1 FROM tab where key=k)
    ;

UPDATE tab
    SET oldx=oldx+y, oldy=oldy+y
    WHERE key = k
    ;
1 голос
/ 17 сентября 2011

Не уверен, как ваша база данных поддерживает Upsert .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...