SQLite
 sql >> база данни >  >> RDS >> SQLite

Как да пропуснете редове, които нарушават ограничения при вмъкване на данни в SQLite

В SQLite, когато се опитате да вмъкнете няколко реда в таблица и някой от тези редове нарушава ограничение за тази таблица, операцията ще се провали.

Това може да се очаква, в крайна сметка, за това е ограничението.

Но какво ще стане, ако просто искате да игнорирате всички редове, които нарушават ограниченията? С други думи, ако даден ред нарушава ограничение, искате SQLite да пропусне този ред, след което да продължи обработката на следващия ред и т.н.

За щастие има лесен начин да направите това в SQLite.

Клауза ON CONFLICT

SQLite има ON CONFLICT клауза, която ви позволява да укажете как да се справите с конфликти на ограничения. По-конкретно, това се отнася за UNIQUE , NOT NULL , CHECK и PRIMARY KEY ограничения (но не и FOREIGN KEY ограничения).

ON CONFLICT клаузата се използва в CREATE TABLE оператори, но при вмъкване на данни клаузата се заменя с OR .

Следователно можете да използвате тази клауза, за да определите как да се справите с нарушенията на ограниченията при вмъкване на данни.

Има пет възможни стойности, които можете да използвате с тази клауза:

  • ROLLBACK
  • ABORT
  • FAIL
  • IGNORE
  • REPLACE

За целите на тази статия ще използваме IGNORE опция.

Използване на IGNORE кара SQLite да пропусне единия ред, който съдържа нарушението на ограничението и да продължи обработката на следващите редове, сякаш нищо не се е объркало.

Пример

Ето CREATE TABLE изявление за таблица, наречена Продукти :

CREATE TABLE Products( 
    ProductId INTEGER PRIMARY KEY, 
    ProductName NOT NULL, 
    Price 
);

Забележете, че тази таблица включва NOT NULL ограничение за ProductName колона.

Сега нека се опитаме да вмъкнем данни, които нарушават това ограничение.

INSERT INTO Products VALUES 
    (1, 'Widget Holder', 139.50),
    (2, NULL, 11.00),
    (3, 'Widget Stick', 89.75);

Резултат:

Error: NOT NULL constraint failed: Products.ProductName

Не е изненадващо, че получаваме грешка, показваща, че NOT NULL ограничението е нарушено.

Сега нека видим колко реда бяха вмъкнати в таблицата.

SELECT COUNT(*) FROM Products;

Резултат:

0

Така че знаем, че само вторият ред е нарушил ограничението, но това е предотвратило някои данни от вмъкване.

Можем да променим това, като добавим OR IGNORE към нашия INSERT изявление:

INSERT OR IGNORE INTO Products VALUES 
    (1, 'Widget Holder', 139.50),
    (2, NULL, 11.00),
    (3, 'Widget Stick', 89.75);

Това е всичко, което се изисква. Изпълнението на този код не води до грешка като предишния код. Изпълнението на този код води до вмъкване на добрите данни и игнориране на лошите данни.

Сега, ако изпълним SELECT изявление срещу таблицата, можем да видим, че добрите данни всъщност са били вмъкнати.

SELECT * FROM Products;

Резултат:

ProductId   ProductName    Price     
----------  -------------  ----------
1           Widget Holder  139.5     
3           Widget Stick   89.75     


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Актуализиране на данните за дейността от услугата, когато е на пауза

  2. Как да изчислим разликата между две времеви марки в SQLite

  3. Проблем със SQLiteOpenHelper на android 2.X и 3.X

  4. SQLiteException няма такава таблица:ItemTable по време на компилиране:Select_id,.... от ItemTable

  5. Експортирайте база данни SQLite в XML файл