MySQL: как сделать атрибут «обнуляемым» только при определенных условиях - PullRequest
1 голос
/ 18 марта 2020

Я создаю таблицу для БД, и я хотел бы (если это возможно) сделать что-то вроде этого: Атрибут X может быть НЕДЕЙСТВИТЕЛЕН, если и только если атрибут Y равен «value1».

Есть ли способ сделать это? Я хочу сделать это, потому что я мог бы удалить сущность, уменьшив сложность моего проекта (или, по крайней мере, я думаю, что получил бы некоторые преимущества).

Спасибо :))

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Если версия MySQL недостаточно новая для использования ограничения CHECK (ниже 8.0.16), тогда используйте

DELIMITER @@;

CREATE TRIGGER tr_bi_check_my_constraint
BEFORE INSERT
ON my_table
FOR EACH ROW
BEGIN
    IF NEW.attribute_X IS NULL AND NEW.attribute_Y != 'value1' THEN
        SIGNAL SQLSTATE 45000
            SET MESSAGE_TEXT = 'Attribute X can be NULL if, and only if, attribute Y is "value1".';
    END IF;
END
@@;

CREATE TRIGGER tr_bu_check_my_constraint
BEFORE UPDATE
ON my_table
FOR EACH ROW
BEGIN
    IF NEW.attribute_X IS NULL AND NEW.attribute_Y != 'value1' THEN
        SIGNAL SQLSTATE 45000
            SET MESSAGE_TEXT = 'Attribute X can be NULL if, and only if, attribute Y is "value1".';
    END IF;
END
@@;

DELIMITER ;
1 голос
/ 18 марта 2020

В самых последних версиях MySQL вы можете использовать проверочное ограничение для этого:

create table mytable (
    x int,
    y int,
    check(x is not null or y = 1)
)
...