Подтвердить что ты не робот

Ограничение CHECK в MySQL не работает

Сначала я создал таблицу типа

CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);

а затем вставленные значения в этой таблице

INSERT INTO Customer values ('-2','abc','zz');

В MySQL не отображается ошибка, она принимает значения.

4b9b3361

Ответ 1

Справочное руководство по MySQL говорит:

Предложение CHECK анализируется, но игнорируется всеми механизмами хранения.

Попробуйте триггер...

mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer 
    -> FOR EACH ROW 
    -> BEGIN 
    -> IF NEW.SD<0 THEN 
    -> SET NEW.SD=0; 
    -> END IF; 
    -> END
    -> //
mysql> delimiter ;

Надеюсь, что это поможет.

Ответ 2

К сожалению, MySQL не поддерживает ограничения проверки SQL. Вы можете определить их в своем DDL-запросе по причинам совместимости, но они просто игнорируются.

Существует простая альтернатива

Вы можете создать триггеры BEFORE INSERT и BEFORE UPDATE, которые либо вызывают ошибку, либо устанавливают поле по умолчанию, когда требования к данным не выполняются.

Пример для BEFORE INSERT, работающий после MySQL 5.5

DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test`
FOR EACH ROW
BEGIN
    IF CHAR_LENGTH( NEW.ID ) < 4 THEN
        SIGNAL SQLSTATE '12345'
            SET MESSAGE_TEXT := 'check constraint on Test.ID failed';
    END IF;
END$$   
DELIMITER ;  

До MySQL 5.5 вам пришлось вызвать ошибку, например. вызовите процедуру undefined.

В обоих случаях это вызывает неявный откат транзакций. MySQL не позволяет сам оператор ROLLBACK выполнять процедуры и триггеры.

Если вы не хотите откатывать транзакцию (INSERT/UPDATE должен пройти даже с неудачным "контрольным ограничением", вы можете перезаписать значение с помощью SET NEW.ID = NULL, которое установит идентификатор в значение по умолчанию по умолчанию, не действительно имеют смысл для id tho

Edit: Удалена бродячая цитата.

Относительно оператора :=:

В отличие от =, оператор := никогда не интерпретируется как оператор сравнения. Это означает, что вы можете использовать := в любом действительном операторе SQL (а не только в операторах SET) для назначения значения переменной.

https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html

В отношении котировок идентификаторов обратных ссылок:

Символ кавычки идентификатора - это обратная сторона ( "`" )

Если включен режим SQL ANSI_QUOTES SQL, допустимо также указывать идентификаторы в двойных кавычках

http://dev.mysql.com/doc/refman/5.6/en/identifiers.html

Ответ 3

CHECK ограничения игнорируются MySQL, как объясняется в мини-комментарии в документах: CREATE TABLE

Предложение CHECK анализируется, но игнорируется всеми механизмами хранения.

Ответ 4

Ограничение CHECK, похоже, не реализовано в MySQL.

Смотрите этот отчет об ошибке: https://bugs.mysql.com/bug.php?id=3464

Ответ 6

Проверочные ограничения поддерживаются начиная с версии 8.0.15 (еще не выпущены)

https://bugs.mysql.com/bug.php?id=3464

[23 января 16:24] Пол Дюбуа

Опубликовано разработчиком: Исправлено в 8.0.15.

Ранее MySQL разрешал ограниченную форму синтаксиса ограничения CHECK, но анализировал и игнорировал его. MySQL теперь реализует основные функции ограничений CHECK для таблиц и столбцов для всех механизмов хранения. Ограничения определяются с помощью операторов CREATE TABLE и ALTER TABLE.

Ответ 7

Обновление до MySQL 8.0.16 для использования checks:

Начиная с MySQL 8.0.16, CREATE TABLE разрешает основные функции ограничений CHECK для таблиц и столбцов для всех механизмов хранения. CREATE TABLE разрешает следующий синтаксис ограничения CHECK как для ограничений таблицы, так и для ограничений столбцов

Документация по проверке MySQL

Ответ 8

попробуйте с set sql_mode = 'STRICT_TRANS_TABLES' ИЛИ SET sql_mode='STRICT_ALL_TABLES'