создать ограничение таблицы в MySQL - PullRequest
6 голосов
/ 07 декабря 2011

У меня есть таблица, в которой у меня есть несколько столбцов a,b,c, и для каждого столбца есть другой столбец, скажем, (x,y,z), который зависит от a,b,c соответственно.

x,y,z будет иметь значение 1, если a,b,c имеет какое-либо значение, и будет содержать ноль, если a,b,c has null.

. Например, скажем, значения, хранящиеся в aравен 2, а x является зависимым от него столбцом.Так что x будет иметь значение как 1.

Если значения, хранящиеся в a, равны null, тогда x будет иметь значение как null.

, так же как иесть способ, которым мы можем объявить это ограничение во время создания таблицы.

Пожалуйста, предложите что-нибудь кроме триггеров.

Ответы [ 5 ]

7 голосов
/ 07 декабря 2011

Если цель 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;

, а затем основывать другие ваши запросы на этом представлении, а не непосредственно на таблице.

4 голосов
/ 18 ноября 2012

Требуемое ограничение - это проверочное ограничение.

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 здесь

Если вам нужен дополнительный совет, объясните, почему триггеры не подходят для вашей задачи.

1 голос
/ 07 декабря 2011

Помимо ограничений, вы можете достичь аналогичного результата, если не сохраните все столбцы 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
1 голос
/ 07 декабря 2011

Да, вы можете использовать для этого триггеры .

Из синтаксиса триггера глава:

Если триггер BEFORE не выполнен, операция с соответствующей строкой не выполняется

Хотя описанный вами сценарий подразумевает, что данные не нормализованы.

1 голос
/ 07 декабря 2011

MySQL не обрабатывает CONSTRAINTS per se, но вы можете реализовать аналогичное поведение, используя TRIGGER для событий BEFORE INSERT и BEFORE UPDATE.Вам, однако, придется полагаться на некоторые другие ограничения уровня таблицы (NOT NULL), чтобы заставить его работать, согласно этому другому вопросу о SO .

В вашем очень конкретном случаеЭто выглядит так, как если бы вы хотели использовать триггер для вычисления значений ваших x, y, z значений в триггере, а не использовать его для предотвращения вставки данных с «неправильными» значениями - но ваш вопрос не решает эту проблемуоднозначно ясно, так что это зависит от того, что вы действительно хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...