sql >> Databáze >  >> RDS >> Mysql

Jak přidat kladné celočíselné omezení do celočíselného sloupce v MySQL?

Použili byste klíčové slovo unsigned což znamená, že celé číslo neumožňuje "znaménko" (tj. - může být pouze kladné):

CREATE TABLE test (
    test_column int(11) unsigned
);

Můžete si přečíst více o numerických typech dat (podepsaný a nepodepsaný) zde .

Pokud jde o skutečné omezení aby se zabránilo vkládání záporných hodnot, má MySQL CHECK klauzule, kterou lze použít v CREATE TABLE prohlášení však podle dokumentace:

Pro informaci, zde je návod, jak byste to použili (a ačkoli to bude fungovat naprosto v pořádku, prostě nedělá nic - jak uvádí manuál):

CREATE TABLE test (
    test_column int(11) unsigned CHECK (test_column > 0)
);

AKTUALIZACE (úplné odmítnutí záporných hodnot)
Z několika vašich komentářů jsem si všiml, že chcete, aby byly dotazy se zápornými hodnotami zcela odmítnuty a nebyly nastaveny na 0 (jako běžná transakce do unsigned sloupec by stačil). Neexistuje žádné omezení, které by to mohlo udělat obecně (o kterém alespoň vím), pokud však zapnete přísný režim (s STRICT_TRANS_TABLES ) jakýkoli dotaz, který vloží zápornou hodnotu do nepodepsaného sloupce, selže s chybou (spolu s dalšími chybami vkládání dat, jako je neplatný enum hodnota).

Můžete to otestovat spuštěním následujícího příkazu před příkazy insert-commands:

SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';

A pokud vám to vyhovuje, můžete buď aktualizovat konfiguraci MySQL pomocí sql-mode="STRICT_TRANS_TABLES" nebo použijte SET @@GLOBAL.sql_mode = 'STRICT_TRANS_TABLES'; (Nejsem si jistý, zda SET příkaz však ovlivní globální konfiguraci mysql, takže může být lepší aktualizovat skutečný konfigurační soubor).



  1. UNPIVOT na neurčitém počtu sloupců

  2. Získejte celkový časový interval z více řádků, pokud není sekvence porušena

  3. Jak seskupit podle měsíce v PostgreSQL

  4. Načítání určitých řetězců v řetězci pomocí Oracle SQL