@ Sklivvz: тестируя с MySQL 5.0.51a, я обнаружил, что он анализирует ограничение CHECK, но не применяет его. Я могу вставить (NULL, NULL) без ошибок. Проверено как MyISAM, так и InnoDB. Впоследствии использование SHOW CREATE TABLE показывает, что ограничение CHECK отсутствует в определении таблицы, даже если при определении таблицы не было ошибки.
Это соответствует руководству MySQL , в котором говорится: «Предложение CHECK анализируется, но игнорируется всеми механизмами хранения.»
Так что для MySQL вам придется использовать триггер, чтобы применить это правило. Единственная проблема заключается в том, что триггеры MySQL не могут ни вызвать ошибку, ни прервать операцию INSERT. Единственное, что вы можете сделать в триггере, чтобы вызвать ошибку, - установить для столбца NOT NULL значение NULL.
CREATE TABLE foo (
FieldA INT,
FieldB INT,
FieldA_or_FieldB TINYINT NOT NULL;
);
DELIMITER //
CREATE TRIGGER FieldABNotNull BEFORE INSERT ON foo
FOR EACH ROW BEGIN
IF (NEW.FieldA IS NULL AND NEW.FieldB IS NULL) THEN
SET NEW.FieldA_or_FieldB = NULL;
ELSE
SET NEW.FieldA_or_FieldB = 1;
END IF;
END//
INSERT INTO foo (FieldA, FieldB) VALUES (NULL, 10); -- OK
INSERT INTO foo (FieldA, FieldB) VALUES (10, NULL); -- OK
INSERT INTO foo (FieldA, FieldB) VALUES (NULL, NULL); -- gives error
Вам также необходим аналогичный триггер ДО ОБНОВЛЕНИЯ.