SQL: запрос на вставку новой записи или замену только некоторых полей - PullRequest
3 голосов
/ 13 января 2011

Моя база данных - SQLite, но я уверен, что вопрос относится к SQL в целом.Скажем, у меня есть таблица «Students» со столбцами «id» (первичный ключ), «name», «selected».Время от времени мне нужно обновлять указанную таблицу из внешнего источника, но я получаю только таблицу идентификаторов и имен.Когда указанное обновление происходит для каждой строки, мне нужно:

  1. Если нет строки с таким же идентификатором, добавить новую строку в таблицу со значением по умолчанию для «selected»

  2. Если строка уже существует, обновите только поле «name», отменив «selected»

Это должно быть выполнено в пакете с одним запросом с заполнителями.Кроме того, случай упрощен, на самом деле мне нужно написать универсальный код для обновления набора таблиц, каждая из которых содержит несколько полей для обновления и несколько «локальных» полей.

К сожалению, я не могу найти подходящий способвыразить свое желание SQLite.Если я использую запрос REPLACE:

INSERT OR REPLACE INTO students (id, name) VALUES (:id, :name)

, это очистит поле «выбранное», а если я использую UPDATE:

UPDATE students SET name = :name WHERE id = :id

, это не добавит новые строки.

Итак, как правильно это сделать?У меня такое чувство, что я упускаю что-то очень-очень простое, и что я буду чувствовать себя очень-очень глупо, когда получу ответ:)

Ответы [ 2 ]

2 голосов
/ 13 января 2011

INSERT or REPLACE не универсален. Каждая БД имеет свой собственный синтаксис (например, MERGE для SQL Server 2005 и более поздних версий), и многие не имеют всего этого. Универсальным решением для этого являются два утверждения.

UPDATE students SET name = :name WHERE id = :id

с последующим

INSERT INTO Students 
(ID, Name)
Values
(:id,:name)
WHERE 
Not exists (select * from students where ID= :id)
1 голос
/ 13 января 2011

Я обычно использую LEFT JOIN для INSERT и DELETE и JOIN для обновлений. Обратите внимание, что это происходит как один большой запрос, а не как запись по базе записей:

UPDATE T1
FROM T1 JOIN T2 ON T1.PK = T2.PK

INSERT T1
SELECT 
FROM T2 LEFT JOIN T1 ON T2.PK = T1.PK
WHERE T1.PK IS NULL

DELETE T1
FROM T1 LEFT JOIN T2 ON T1.PK = T2.PK
WHERE T2.PK IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...