Не работает ограничение уникальности столбца MySQL 3, возможно, из-за NULL - PullRequest
0 голосов
/ 12 февраля 2012

Это мой стол, GameAdmin:

game_id   company_id    user_id
1         5             NULL
1         5             NULL
1         NULL          2
1         NULL          3
1         NULL          3

Он связывает игры с сущностями, которые могут их редактировать (либо компанией, либо пользователем).

У меня есть индекс UNIQUE для всех столбцов, но, как вы можете видеть, он работает не так, как ожидалось.

Что не так? Это из-за NULL с?


Я знаю, что могу заставить это работать, изменив структуру на:

game_id   admin_type    admin_id
1         company       5
1         company       5
1         user          2
1         user          3
1         user          3

Но это не совместимо с моей настройкой JPA / Hibernate или, по крайней мере, очень неудобно, потому что не позволяет мне устанавливать отношения следующим образом:

@ManyToOne(optional=true)
private User user;

@ManyToOne(optional=true)
private Company company;

Ответы [ 3 ]

1 голос
/ 12 февраля 2012

О, решение очень простое.Я разделил ограничение, поэтому есть одно для game_id и company_id, а для game_id и user_id.

0 голосов
/ 12 февраля 2012

Если вы знаете (и я имею в виду знаю , а не думаю ), что у вас никогда не будет более 2-х возможных классов (пользователь / компания), просто используйте отрицательные идентификаторы на одном из им.

  • Я знаю, что это не 1NF
  • Я знаю, что это хакер
  • Я знаю, это не очень красиво

Но ИМХО это на приемлемой стороне "тонкой красной линии".

0 голосов
/ 12 февраля 2012

Это из-за значения NULL. Они не считаются уникальными. Если у вас нет внешних ключей в этих полях, вы можете использовать 0 вместо NULL.

...