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