У меня есть таблица, в которой у меня есть несколько столбцов a,b,c
и для каждого столбца есть другой столбец, скажем, (x,y,z)
который зависит от a,b,c
соответственно.
x,y,z
будет иметь значение 1
если a,b,c
имеет любое значение и будет содержать null, если a,b,c has null
.
Например, скажем, значения, хранящиеся в a
равны 2
а x
– столбец, зависящий от него. Таким образом, x
будет иметь значение 1
.
Если значения, хранящиеся в a
, null
тогда x
будет иметь значение как null
.
поэтому есть способ, которым мы можем объявить это ограничение во время создания таблицы.
Пожалуйста, предложите что-нибудь, кроме триггеров.
Если целью x
, y
и z
является упрощение некоторых запросов, вместо того, чтобы иметь x
, y
и z
качестве столбцов на вашей таблице, вы также можете рассмотреть возможность использования представления для этого, например
create view myview as select a, b, c, if (isnull(a), null, 1) as x, if (isnull(b), null, 1) as y, if (isnull(c), null, 1) as z from mytable;
а затем основывайте свои другие запросы на этом представлении, а не прямо на столе.
Ограничение, которое вы ищете, – это ограничение проверки.
CREATE TABLE test ( a varchar(10), b varchar(10), c varchar(10), x integer, y integer, z integer, CONSTRAINT chk_X_Nulls CHECK ((a is null and x is null) or (a is not null and x = 1)), CONSTRAINT chk_Y_Nulls CHECK ((b is null and y is null) or (b is not null and y = 1)), CONSTRAINT chk_Z_Nulls CHECK ((c is null and z is null) or (c is not null and z = 1)) );
К сожалению, это не реализовано в MySQL . Существует открытый отчет об ошибках, относящийся к 2004 году для этой функции, поэтому не ожидайте увидеть его в ближайшее время.
Другие ответили, что вы можете использовать триггеры или представления для достижения желаемого результата, и это правильные ответы для MySQL.
Вы также можете частично ограничить свои данные с помощью простых трюков:
x, y, z
для enum('1')
. Это предотвратит вставку значений, отличных от null
и '1'
, но не гарантирует правильность значений. a, b, c
имеют ограниченный диапазон возможных значений, вы можете создавать ограничения внешнего ключа для других таблиц и заполнять эти таблицы любым возможным значением a, b, c
x, y, z
по расписанию (например, один раз в час или один раз в день). Значения для x, y, z
могут быть скорректированы, если они ошибочны. Вы можете увидеть ограничение проверки в действии с помощью PostGreSQL здесь
Если вам нужны дополнительные советы, объясните, почему триггеры не подходят для вашей задачи.
MySQL не обрабатывает CONSTRAINTS
per se, но вы можете реализовать аналогичное поведение, используя TRIGGER
в событиях BEFORE INSERT
и BEFORE UPDATE
. Однако вам придется полагаться на некоторые другие ограничения на уровне таблиц ( NOT NULL
), чтобы заставить его работать, согласно этому другому вопросу о SO .
В вашем конкретном случае это похоже на то, что вы хотели бы использовать триггер для вычисления значения ваших значений x, y, z
в триггере, а не для его использования, чтобы предотвратить вставку данных с «неправильными» значениями, но ваш вопрос не делает эту точку однозначно ясной, так что это зависит от того, что вы действительно хотите.
Да, для этого вы можете использовать триггеры .
Из главы синтаксиса триггера :
Если триггер BEFORE не работает, операция в соответствующей строке не выполняется
Хотя описанный вами сценарий подразумевает, что данные не нормализованы.
Помимо ограничений, вы можете добиться аналогичного результата, не сохраняя при этом все столбцы x, y, z и используя представление:
CREATE VIEW myView AS SELECT a, b, c, ( a = a ) AS x, ( b = b ) AS y, ( c = c ) AS z FROM myTable