Зависимые ограничения столбца - PullRequest
0 голосов
/ 18 мая 2018

Не уверен, смогу ли я достичь этого с помощью ограничения mysql, но в такой таблице, как

CREATE TABLE constraint_table (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)

, возможно ли иметь ограничение mysql, так что col2 может иметь дубликаты дляданное col1

| id | col1 | col2 |
| 1  | 1    | 1    | 
| 2  | 1    | 2    |
| 3  | 1    | 1    |

, но значения col2, используемые конкретным значением col1, не могут использоваться другим значением col1 снова

| id | col1 | col2 |
| 1  | 1    | 1    | 
| 2  | 1    | 2    |
| 3  | 1    | 1    | 
| 4  | 2    | 1    | invalid - as 1 is included in col2 values where col1 <> 2 (need to restrict this)
| 5  | 2    | 2    | invalid - as 2 is included in col2 values where col1 <> 2 (need to restrict this)
| 6  | 2    | 4    | valid - as 4 is not included in col2 values where col1 <> 2

и действительнымтаблица должна выглядеть так:

| id | col1 | col2 |
| 1  | 1    | 1    | 
| 2  | 1    | 2    |
| 3  | 1    | 1    |
| 4  | 2    | 3    |
| 5  | 2    | 4    |
| 6  | 2    | 4    |

Извините за плохой заголовок, я не знаю, как назвать такой сценарий.

Ответы [ 2 ]

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

Я думаю, у вас неправильный формат данных.Кажется, вы хотите одно значение col1 для каждого col2.Это предлагает таблицу для этой цели:

create table2 (
    col2 int primary key,
    col1 int not null,
);

Тогда ваша таблица может быть:

CREATE TABLE constraint_table (
    id int PRIMARY KEY AUTOINCREMENT,
    col2 int NOT NULL,
    . . . -- I assume there are other tables here
    foreign key (col2) references table2(col2)
);

col1 не принадлежит этой таблице, поскольку она строго зависит от col2.Итак, пара идет в первой таблице - с одной строкой.

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

Веселись!

CREATE TABLE ref_data (
  col1 INT NOT NULL,
  col2 INT NOT NULL,
  INDEX (col1),
  UNIQUE KEY (col2)
) ENGINE=INNODB;

CREATE TABLE constraint_table (
  id int NOT NULL auto_increment,
  col1 int NOT NULL,
  col2 int NOT NULL,
  PRIMARY KEY (id),
  CONSTRAINT cn_col FOREIGN KEY (col1,col2)
REFERENCES ref_data (col1,col2)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...