Portál AbcLinuxu, 6. května 2025 18:44
Řešení dotazu:
CREATE TABLE omezeni(cislo int CHECK(cislo IN(0,1,5,9)));Příkaz sice proběhl bez chyby, ale uložilo se každé číslo bez omezení. Když jsem zkusil totéž s databází SQLite, fungovalo to naprosto bez vady. Pokud tuto funkčnost a mnoho dalších chybějících v MySQL potřebuješ, doporučuji přejít na SQLite.
mysql> select @@sql_mode; +------------+ | @@sql_mode | +------------+ | | +------------+ 1 row in set (0.00 sec) mysql> CREATE TABLE e ( abc ENUM('a', 'b', 'c') ) ENGINE = MyISAM; Query OK, 0 rows affected (0.00 sec) mysql> insert into e(abc) VALUES('invalid'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +---------+------+------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------+ | Warning | 1265 | Data truncated for column 'abc' at row 1 | +---------+------+------------------------------------------+ 1 row in set (0.00 sec) mysql> select * from e; +------+ | abc | +------+ | | +------+ 1 row in set (0.00 sec) mysql> SET @@session.sql_mode = 'STRICT_TRANS_TABLES'; Query OK, 0 rows affected (0.00 sec) mysql> insert into e(abc) VALUES('invalid'); ERROR 1265 (01000): Data truncated for column 'abc' at row 1 mysql> select * from e; +------+ | abc | +------+ | | +------+ 1 row in set (0.00 sec)Ale ENUM nedoporučuji, a je otázkou jestli bude fungovat s klauzulí
NOT NULL
(takže k výčtu přibude i NULL).
mysql> select @@sql_mode; +---------------------+ | @@sql_mode | +---------------------+ | STRICT_TRANS_TABLES | +---------------------+ 1 row in set (0.00 sec) mysql> CREATE TABLE e ( abc ENUM('1', '2', '3') ) ENGINE = MyISAM; Query OK, 0 rows affected (0.01 sec) mysql> insert into e(abc) VALUES(1); Query OK, 1 row affected (0.00 sec) mysql> insert into e(abc) VALUES(9); ERROR 1265 (01000): Data truncated for column 'abc' at row 1 mysql> select * from e; +------+ | abc | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> select abc*7 AS col from e; +------+ | col | +------+ | 7 | +------+ 1 row in set (0.00 sec) mysql>
CREATE TABLE e ( abc ENUM('0', '1', '5', '9') ) ENGINE = MyISAM; INSERT INTO e(abc) VALUES(1); INSERT INTO e(abc) VALUES(3); SELECT * FROM e;Mně to vypisuje hovadiny.
0 → '0' (dle hodnoty) 1 → '1' (dle hodnoty) 2 → '1' (dle indexu) 3 → '5' (dle indexu) 4 → '9' (dle indexu) 9 → '9' (dle hodnoty)jiná čísla nejsou platná - to se vyplatí, ne?!
The CHECK clause is parsed but ignored by all storage engines.Nemůžu si pomoc, MySQL si svou pověst zaslouží...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.