Зависимые ограничения столбца

0

Не уверен, могу ли я достичь этого, используя ограничение 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

Я думаю, что у вас неправильный формат данных. Кажется, вам нужно одно значение 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
    Спасибо! Я понял вашу идею, и она работает, как и ожидалось. Мне было просто любопытно, если это возможно без создания новой таблицы.
  • 0
    @nambi. , , Возможно нет. Вы имеете дело с денормализованными данными. Отношения внешнего ключа являются частью поддержания целостности данных для нормализованных данных (они могут работать в других ситуациях), поэтому в этом случае они могут работать нелегко.
0

Веселиться!

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;
  • 0
    Спасибо! он работает, как и ожидалось, но просто любопытно, если это возможно без создания новой таблицы.
  • 0
    Вы не можете сделать это с одной таблицей и ограничением. Но вы можете создать одну таблицу и один триггер

Ещё вопросы

Сообщество Overcoder
Наверх
Меню