Portál AbcLinuxu, 2. listopadu 2025 22:48
Ř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.