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

Jaké je pravidlo pro „neznámé“ a odvození typu?

Jsou tam vlastně tři otázky, na které se pokusím odpovědět.

  1. Jaký je účel unknown ?

    Toto je datový typ, který byl původně přiřazen hodnotám NULL a řetězcovým literálům v příkazech SQL. Pokud by takovým literálům byl přiřazen typ text okamžitě by bylo obtížné odvodit správný typ.

    Například chcete myfunc('hello') pro vyvolání myfunc(character varying) , ale neexistuje žádné implicitní přetypování z text na character varying (a pokud byste jej vytvořili, způsobilo by to nejednoznačnost).

  2. Proč SELECT null vrátí sloupec typu unknown ?

    Tradiční odpověď zní:Protože uživatel nespecifikoval typ.

    Toto chování však bylo problematické. Pokud například vytvoříte tabulku takto:

    CREATE TABLE test
       AS SELECT 'hello';
    

    skončili byste se sloupcem typu unknown , což je nežádoucí a způsobí další problémy. Typ unknown skutečně by neměl být viditelný pro uživatele, ale spíše detail implementace.

    V důsledku toho změnil chování z PostgreSQL v10 na:Nyní jakékoli unknown s vlevo v SELECT nebo RETURNING seznam jsou nuceni text a nelze vytvořit tabulky se sloupci typu unknown .

  3. Proč SELECT NULL UNION SELECT 42 fungovat, ale ne SELECT NULL UNION SELECT NULL UNION SELECT 42 ?

    To je způsobeno pravidly konverze typů .UNION je vlevo asociativní, takže druhý dotaz je interpretován jako

    (SELECT NULL UNION SELECT NULL) UNION SELECT 42;
    

    Nyní první UNION překládá na datový typ text kvůli pravidlu 3:

    To způsobí chybu při pokusu o vyřešení typu pro druhý UNION kvůli pravidlu 4:

    Na druhou stranu v dotaz

    SELECT NULL UNION SELECT 42;
    

    „NULL“ má typ unknown a „42“ má typ integer (typ zvolený pro číselné literály bez desetinné čárky).

    Pravidlo 5

    zde neplatí, protože integer není preferovaným typem ve své kategorii (to by bylo oid a double precision ), takže se použije pravidlo 6:

    Výsledkem je typ integer .




  1. Anotace Spring Data @CreatedDate mi nefunguje

  2. Jak zakázat všechna omezení cizího klíče v databázi SQL Server - SQL Server / TSQL výukový program, část 77

  3. Rozdíl data/času v PHP/MySQL

  4. je mít miliony tabulek a miliony řádků v nich běžnou praxí při návrhu databáze MySQL?