sql >> Database teknologi >  >> RDS >> Mysql

Hvordan tilføjer man en positiv heltalsbegrænsning til en heltalskolonne i MySQL?

Du ville bruge søgeordet unsigned for at angive, at hele tallet ikke tillader et "tegn" (dvs. - det kan kun være positivt):

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

Du kan læse mere om de numeriske datatyper (signeret og usigneret) her .

For så vidt angår en faktisk begrænsning for at forhindre indsættelse af negative værdier har MySQL en check klausul, der kan bruges i CREATE TABLE erklæring dog ifølge dokumentationen:

Til reference, her er, hvordan du ville bruge det (og selvom det vil fungere helt fint, gør det bare ingenting - som manualen siger):

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

OPDATERING (afviser negative værdier fuldstændigt)
Jeg har bemærket fra et par af dine kommentarer, at du ønsker, at forespørgsler med negative værdier skal afvises fuldstændigt og ikke indstilles til 0 (som en normal transaktion til en usigneret kolonne ville gøre). Der er ingen begrænsning, der kan gøre dette generelt (som jeg i det mindste kender til), hvis du slår strict-mode til (med STRICT_TRANS_TABLES ) enhver forespørgsel, der indsætter en negativ værdi i en usigneret kolonne, vil mislykkes med en fejl (sammen med eventuelle andre dataindsættelsesfejl, såsom en ugyldig enum værdi).

Du kan teste det ved at køre følgende kommando før dine insert-kommandoer:

SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';

Og hvis det virker for dig, kan du enten opdatere din MySQL-konfiguration med sql-mode="STRICT_TRANS_TABLES" eller brug SET @@GLOBAL.sql_mode ='STRICT_TRANS_TABLES'; (Jeg er ikke sikker på, om SET kommandoen vil dog påvirke den globale mysql config, så det kan være bedre at opdatere den faktiske config-fil).



  1. Opret forbindelse til mysql på en anden server

  2. MySQL opdatere hele databasen uden nedetid

  3. Kun variabler skal videregives ved reference i... på linje 13 Ikke bestået

  4. Hvordan kan jeg bruge SQL's YEAR(), MONTH() og DAY() i Doctrine2?