sql >> Databáze >  >> RDS >> PostgreSQL

Nejednoznačný odkaz na sloupec v INSERT ... PŘI KONFLIKTU PROVEĎTE AKTUALIZACI

Sloupec, kde by byl jinak nejednoznačný, musíte kvalifikovat jako tabulku.
Použijte název virtuální tabulky excluded odkazovat na vstupní řádek. Pravděpodobně však chcete odkazovat na cílový sloupec, takže kvalifikujte s názvem cílové tabulky:

INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1  -- here
RETURNING count;

Příručka:

Jediný řádek z virtuální vstupní tabulky excluded obsahuje vše sloupce cílové tabulky, i když nejsou uvedeny v seznamu cílových sloupců INSERT nebo VALUES výraz. Takže nejednoznačnost, se kterou jste se setkali, existuje vždy, ať už count je cíleno explicitně nebo ne.

Stranou:Sloupce vynechané v seznamu cílových sloupců mají výchozí hodnotu pro příslušný sloupec DEFAULT hodnota, což je NULL ve výchozím nastavení (NULL je výchozí sloupec DEFAULT ). To znamená, že výchozí nastavení bude NULL ve vašem nastavení a 1 v mém vylepšeném nastavení níže. A spouštěče na úrovni řádku BEFORE INSERT (pokud existují).

Ani jedno z toho však neplatí pro příklad, protože odkazuje na cíl sloupec přece.

Zejména další dva výskyty názvu sloupce count jsou jednoznačné (a nevyžadují tedy kvalifikaci pro tabulku), protože mohou odkazovat pouze na cíl tabulka.

Vaše nastavení se může snadno zlomit, zatímco sloupec count není definováno NOT NULL , jako NULL + 1 je stále NULL . Toto nastavení by dávalo větší smysl:

CREATE TABLE test.test_counter (
  id    text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);

V mém příkladu také nepoužívám jména případu CaMeL v uvozovkách. Viz:




  1. SQL - Převést formát data a času

  2. Zdá se, že metoda dotazu PDO s bindValue() nefunguje

  3. Jak zkontrolovat hodnotu null pro double, která je převzata z databáze

  4. Klauzule IN připravená PDO s pojmenovanými zástupnými symboly nefunguje podle očekávání