2016-10-13 3 views
0

У меня есть таблица со столбцами: A B C D При вставке новой строки мне нужно проверить, существует ли B в БД. Если B присутствует в БД, мне нужно изменить A и D на новое значение и увеличить D на 1, иначе просто вставьте новую строку в эту БД. Каков самый правильный способ сделать это? Должен ли я использовать 2 операции БД: попытаться выбрать, и если он присутствует для обновления или использования INSERT или REPLACE или каким-либо другим способом?Как правильно обновить/вставить в sqlite db

Я использую Python3

ответ

1

Вы можете сделать это с помощью SELECT, но было бы проще просто попробовать UPDATE первым:

c.execute("UDPATE X SET A = ?, C = ?, D = D + 1 WHERE B = ?", [newA, newC, oldB]) 
if c.rowcount == 0: 
    c.execute("INSERT INTO X(A,B,C,D) VALUES (?,?,?,?)", [...]) 
+0

Спасибо, но, как @Amir, вы предоставляете только решение, а не объяснение, почему этот способ лучше, чем другие. – wasd

+0

Два утверждения меньше одного. –

0

Другой способ, как показано ниже:

UPDATE table SET A = 1, C=3, D=D+1 WHERE B = 2; 
INSERT INTO table(A,B,C,D) values (1, 2,3,4) WHERE changes() = 0; 

Изменения() будут 0, если обновление не произойдет. ;)

Как вы задали в своем вопросе, вы хотите знать, лучше ли его выбирать, а затем обновлять или вставлять, зависит от выбора ответа.

UPDATE будет иметь почти такую ​​же стоимость, как и SELECT + INSERT. Безусловно, необходимо найти строку (чтение и поиск), а затем изменить данные (написать). Если он не находит строку, которую вы хотите, она не будет писать.

Так что, если вы выбираете первый, а затем UPDATE или INSERT вы будете иметь два состояния:

1- SELECT (чтение) + UPDATE (чтение + запись)

2- SELECT (чтение) + INSERT (написать)

Но с выше запроса вы будете иметь два состояния:

1- UPDATE (чтение + запись)

2- UPDATE (не найдя строку так просто чтения) + INSERT (написать)

Второе состояние похоже на SELECT вместе с INSERT.

Как вы видите, в обоих сценариях все состояния одинаковы, но для первых состояний приведенный выше сценарий будет иметь меньшее чтение.

+0

Спасибо, но, как @CL, вы предоставляете только решение, а не объяснение, почему этот способ лучше других – wasd

+0

Обновлен ответ;) –

Смежные вопросы