MySQL Constraint - разрешить значения столбцов, которые соответствуют идентификатору основной таблицы - PullRequest
0 голосов
/ 22 мая 2018

Я предполагаю, как сделать правильные противопоставления следующим таблицам:

Таблица m_option :

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(32)     | NO   | PRI | NULL    |       |
| name     | varchar(255)| NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

Таблица m_option_value :

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(32)     | NO   | PRI | NULL    |       |
| option   | int(32)     | NO   | INDX| NULL    |       |
| name     | varchar(255)| NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

Таблица product :

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(32)     | NO   | PRI | NULL    |       |
| name     | varchar(255 | NO   |     | NULL    |       |
| option   | int(32)     | NO   | INDX| NULL    |       |
| opt_val  | int(32)     | NO   | INDX| NULL    |       |
+----------+-------------+------+-----+---------+-------+

В таблице product столбцы "option" и "opt_val" являются индексами и имеютпротивопоказание.«option» ограничен внешним ключом «id» в таблице m_option , а «opt_val» ограничен внешним ключом «id» в таблице m_option_value .То, чего я пытаюсь добиться, - это ограничить значения «opt_val» не только его основной таблицей, но и столбцом текущей таблицы option .Я имею в виду, что я хочу разрешить значения в «opt_val» только в том случае, если выполняются два условия: значение должно существовать в option (уже достигнуто с регулярным ограничением), а значение должно иметь такой же идентификатор основной таблицы, что и столбец «option»значение.Если я не правильно выразил mysqlf, я приведу примеры:

Таблица m_option значения:

  • 1 - Цвет
  • 2- форма

таблица m_option_values ​​ значения:

  • 1 - 1 (цвет) - красный
  • 2 - 1 (цвет)- синий
  • 3 - 2 (форма) - квадрат
  • 4 - 2 (форма) - круг

таблица продукт значения:

  • 1 - Toy1 - 1 (цвет) - 1 (красный) ПРАВИЛЬНО
  • 2 - Toy2 - 2 (форма) - 3 (квадрат) ПРАВИЛЬНО
  • 3 - Toy3 - 1 (Цвет) - 4 (Круг) РАЗРЕШЕНО, НО НЕПРАВИЛЬНО

Строка 3 «opt_val» столбец неверен, потому чтостолбец должен разрешать только значения «Color», определенные в «m_option_values» со значением «option», установленным как «1».

1 Ответ

0 голосов
/ 23 мая 2018

У вас неправильное определение внешнего ключа.Предположительно:

create table option_values (
    . . .,
    unique (option, name)
);

Тогда вам нужна составная ссылка:

create table products (
    . . .,
    foreign key (option, opt_val) references option_values (option, name),
    foreign key (option) references options(id)
);
...