Обеспечить уникальность двух столбцов, если третий является истинным - PullRequest
2 голосов
/ 06 февраля 2020
| row (int)     | thingy_a_id (int)     | thingy_b_id (int)     | bool  | bunch_more_cols   |
|-----------    |-------------------    |-------------------    |------ |-----------------  |
| 1             | 6                     | 2                     | 0     |                   |
| 2             | 3                     | 3                     | 0     |                   |
| 3             | 2                     | 4                     | 0     |                   |
| 4             | 2                     | 4                     | 0     |                   |
| 5             | 2                     | 4                     | 1     |                   |
| 6             | 6                     | 2                     | 0     |                   |

В создаваемой мной базе данных мне нужно сочетание двух столбцов, чтобы они были уникальными, НО только в том случае, если третий является истинным. Таким образом, в приведенном выше примере вполне нормально, что строки 3 и 4 имеют одинаковые значения a и b cols, поскольку bool равно False (0). И также хорошо, что строка 5 имеет те же столбцы a & b, что и 3 & 4, потому что это единственное, что bool верно (1). И было бы хорошо, если бы была зафиксирована еще одна строка, где thingy_a_id равен 2, thingy_b_id равен 4, а bool равен False (0).

Что мне нужно предотвратить, так это ДРУГОЙ ряд, который фиксируется, где thingy_a_id равен 2, thingy_b_id равен 4, а bool имеет значение True (1).

Можно ли это сделать с помощью mySql? Как я мог совершить sh это?

1 Ответ

2 голосов
/ 06 февраля 2020

Что касается этого, MySQL не поддерживает частичный уникальный индекс (в отличие от других баз данных, таких как Postgres).

Один из способов обойти это - заменить 0 на * 1004. * столбец с null с: как объясняется в документации , индекс UNIQUE допускает несколько NULL значений для столбцов, которые могут содержать NULL.

Таким образом, вы должны сначала убедиться, что столбец объявлен как null способны, и повернуть все 0 с null:

update mytable set bool = null where bool = 0;

Затем вы можете создать уникальный индекс:

create unique index mytable_idx on mytable(thingy_a_id, thingy_b_id, bool);

С этой настройкой вы можете быть уверены, что дубликаты не будут возникать на (thingy_a_id, thingy_b_id), когда bool имеет значение 1, и что они разрешены, когда bool равен null .

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