Используя sqlite, как я могу обновить или вставить таблицу, используя условие? - PullRequest
0 голосов
/ 23 октября 2019

Имея пустую таблицу с тремя столбцами

CREATE TABLE AssyData    ( AID int NOT NULL PRIMARY KEY UNIQUE , MaxDef float  , MaxDefLC int  , MaxDefNID int , Comps text , SubAssys text )

Я хотел бы обновить или вставить новые значения, если новый MaxMag больше текущего и если AID такой же. AID - это уникальный первичный ключ. Предполагая, что AID равен 100, я пробовал следующее, но безуспешно:

INSERT INTO AssyData 
(AID  , MaxDef  , MaxDefLC  , MaxDefNID , Comps  , SubAssys) 
VALUES( 100 , 101 , 202 , 203 , "" , "") 
ON CONFLICT(AID) 
DO UPDATE 
SET 
MaxDef = excluded.MaxDef , 
MaxDefNID = excluded.MaxDefNID ,
MaxDefLC = excluded.MaxDefLC ,
Comps = excluded.Comps ,
SubAssys = excluded.SubAssys
WHERE excluded.MaxDef > 100 

Я получаю ошибку "около" ON ": синтаксическая ошибка"

Что не так с моим утверждением?

Спасибо, Шон, за подход.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Если ваша версия SQLite не позволяет использовать UPSERT, вы можете достичь того, что вам нужно, в 2 этапа:

INSERT OR IGNORE INTO AssyData 
(AID, MaxDef, MaxDefLC, MaxDefNID, Comps, SubAssys) 
VALUES(100, 111, 202, 203, '', '');

Этот INSERT OR IGNORE завершится неудачно без ошибки, если вы попытаетесьвставьте строку с AID, которая уже существует в таблице. Тогда:

UPDATE AssyData
SET 
  MaxDef = 111, 
  MaxDefLC = 202,
  MaxDefNID = 203,
  Comps = '',
  SubAssys = ''
WHERE AID = 100 AND MaxDef < 111;

Это не будет выполнено, если обновляемая строка содержит MaxDef, равное или большее значения 111. Смотрите демо . В целом такой код требует особой осторожности при реализации, поскольку, как вы можете видеть, значение MaxDef (111 в этом примере) должно быть установлено 3 раза.

1 голос
/ 23 октября 2019

Предполагая, что вы используете несколько новую (3.24 или более новую) версию sqlite, вы можете использовать так называемую UPSERT :

INSERT INTO AssyData(AID, MaxMag, MaxDefNID) VALUES (?, ?, ?)
ON CONFLICT(AID) DO UPDATE SET MaxMag = excluded.MaxMag
                             , MaxDefNID = excluded.MaxDefNID
                    WHERE excluded.MaxMag > MaxMag;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...