sql >> Databáze >  >> RDS >> SQLite

Jak přeskočit řádky, které porušují omezení při vkládání dat do SQLite

Když se v SQLite pokusíte vložit více řádků do tabulky a kterýkoli z těchto řádků poruší omezení v této tabulce, operace se nezdaří.

To se dá očekávat, koneckonců k tomu slouží omezení.

Ale co když chcete ignorovat všechny řádky, které porušují omezení? Jinými slovy, pokud řádek porušuje omezení, chcete, aby SQLite tento řádek vynechal a pokračoval ve zpracování dalšího řádku a tak dále.

Naštěstí existuje snadný způsob, jak to udělat v SQLite.

Ustanovení ON CONFLICT

SQLite má ON CONFLICT klauzule, která vám umožňuje určit, jak zacházet s konflikty omezení. Konkrétněji se vztahuje na UNIQUE , NOT NULL , CHECK a PRIMARY KEY omezení (ale ne FOREIGN KEY omezení).

The ON CONFLICT klauzule se používá v CREATE TABLE příkazy, ale při vkládání dat je klauzule nahrazena OR .

Proto můžete tuto klauzuli použít k určení, jak zacházet s porušením omezení při vkládání dat.

S touto klauzulí můžete použít pět možných hodnot:

  • ROLLBACK
  • ABORT
  • FAIL
  • IGNORE
  • REPLACE

Pro účely tohoto článku budeme používat IGNORE možnost.

Pomocí IGNORE způsobí, že SQLite přeskočí jeden řádek, který obsahuje porušení omezení, a pokračuje ve zpracování následujících řádků, jako by se nic nedělo.

Příklad

Zde je CREATE TABLE výpis pro tabulku s názvem Produkty :

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

Všimněte si, že tato tabulka obsahuje NOT NULL omezení na Název produktu sloupec.

Nyní se pokusíme vložit data, která toto omezení porušují.

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

Výsledek:

Error: NOT NULL constraint failed: Products.ProductName

Není překvapením, že se zobrazí chyba označující NOT NULL omezení bylo porušeno.

Nyní se podívejme, kolik řádků bylo do tabulky vloženo.

SELECT COUNT(*) FROM Products;

Výsledek:

0

Víme tedy, že pouze druhý řádek porušil omezení, ale to zabránilo jakémukoli vkládání dat.

Můžeme to změnit přidáním OR IGNORE do našeho INSERT prohlášení:

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

To je vše, co je potřeba. Spuštění tohoto kódu nezpůsobí chybu jako předchozí kód. Spuštění tohoto kódu má za následek vložení dobrých dat a ignorování špatných dat.

Nyní, když spustíme SELECT oproti tabulce můžeme vidět, že dobrá data byla ve skutečnosti vložena.

SELECT * FROM Products;

Výsledek:

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


  1. Jak získám místní data do databáze pouze pro čtení pomocí dplyr?

  2. Jak načíst počet řádků pro všechny tabulky v databázi SQL SERVER

  3. BadImageFormatException. K tomu dojde při spuštění v 64bitovém režimu s nainstalovanými 32bitovými klientskými součástmi Oracle

  4. Oracle :jak odečíst dvě data a získat minuty výsledku