Najpierw stworzyłem taki stół
CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);
a następnie wstawił wartości do tej tabeli
INSERT INTO Customer values ('-2','abc','zz');
MySQL nie pokazuje błędu, zaakceptował wartości.
mysql
check-constraints
JohnRaja
źródło
źródło
Odpowiedzi:
MySQL 8.0.16 to pierwsza wersja obsługująca ograniczenia CHECK.
Przeczytaj https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html
Jeśli używasz MySQL 8.0.15 lub starszego, w Podręczniku MySQL jest napisane:
Wypróbuj spust ...
Mam nadzieję, że to pomoże.
źródło
CHECK
zdefiniowane ograniczenie. Ach, to byłoby zbyt proste ...Niestety MySQL nie obsługuje ograniczeń sprawdzania SQL. Można je zdefiniować w zapytaniu DDL ze względu na zgodność, ale są one po prostu ignorowane.
Jest prosta alternatywa
Można tworzyć
BEFORE INSERT
iBEFORE UPDATE
wyzwalacze, które powodują błąd lub ustawiają wartość domyślną pola, gdy wymagania danych nie są spełnione.Przykład
BEFORE INSERT
pracy po MySQL 5.5Przed MySQL 5.5 trzeba było spowodować błąd, np. Wywołać niezdefiniowaną procedurę.
W obu przypadkach powoduje to niejawne wycofanie transakcji. MySQL nie zezwala na samą instrukcję ROLLBACK w procedurach i wyzwalaczach.
Jeśli nie chcesz wycofywać transakcji (INSERT / UPDATE powinno przejść nawet przy nieudanym "ograniczeniu sprawdzającym" możesz nadpisać wartość używając
SET NEW.ID = NULL
która ustawi id na wartość domyślną pola, nie ma to sensu dla id ChociażEdycja: Usunięto zbłąkany cytat.
W odniesieniu do
:=
operatora:https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
Odnośnie cudzysłowów identyfikatora odwrotnego znaku:
http://dev.mysql.com/doc/refman/5.6/en/identifiers.html
źródło
DELIMITER
?CHECK
ograniczenia są ignorowane przez MySQL, jak wyjaśniono w niewielkim komentarzu w dokumentacji:CREATE TABLE
źródło
CHECK
ograniczeń, jeśli wartościCHECK
szacowane toFALSE
wtedy wstawianie (lub aktualizacja) nie jest wykonywane i powoduje błąd.Wydaje się, że
CHECK
ograniczenie nie zostało zaimplementowane w MySQL.Zobacz ten raport o błędzie: https://bugs.mysql.com/bug.php?id=3464
źródło
Jak wspomniał joanq, MariaDB wydaje się teraz obsługiwać ograniczenia CHECK wśród innych dodatków:
„Obsługa funkcji CHECK CONSTRAINT ( MDEV-7563 )”.
https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/
źródło
Ograniczenia sprawdzające są obsługiwane od wersji 8.0.15 (jeszcze nie zostanie wydana)
https://bugs.mysql.com/bug.php?id=3464
źródło
Zaktualizuj do MySQL 8.0.16, aby użyć
checks
:Dokumentacja kontroli MySQL
źródło
spróbuj z
set sql_mode = 'STRICT_TRANS_TABLES'
ORSET sql_mode='STRICT_ALL_TABLES'
źródło
CHECK
ograniczenia