|
Как создать уникальный ключ для нескольких колонок?
|
|||
---|---|---|---|
#18+
Допустим, есть таблица "peoples" с полями "name1", "name2", "name3". Нужно создать заклинание уникальности по полям "name1", "name2", "name3". Версия SQLite3: 3.7.4 Создаю таблицу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Заполняю значениями: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
В результате получаю: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Видим, что уникальность не соблюдается строк, которые содержат NULL в ключевых полях. Точно так же ведет себя составной PRIMARY KEY. Это баг SQLite? Как бороться с этой проблемой? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2011, 15:55 |
|
Как создать уникальный ключ для нескольких колонок?
|
|||
---|---|---|---|
#18+
Vano-1981Как бороться с этой проблемой?Объявлять not null для "уникальных" полей. P.S. null ничему не равен. В том числе - другому null. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2011, 18:37 |
|
Как создать уникальный ключ для нескольких колонок?
|
|||
---|---|---|---|
#18+
Basil A. SidorovVano-1981Как бороться с этой проблемой?Объявлять not null для "уникальных" полей. P.S. null ничему не равен. В том числе - другому null. Такой вариант не подходит т.к. в моей БД значение поля может быть NULL. Так потому что таблица содержит настройки для пользователей. Еслли ссылка на пользователя не указана, значит настройка применяется для любого пользователя, у которого она не задана явно. Изначально настроечная БД наполнена дефолтными значениями. Пользователи заходят в систему, меняют настройки. В этот момент в конфиг-базу ложатся индивидуальные настройки. Выше я привел простой пример с одной таблицей (чтобы форумчане не ломали голову). Рабочая версия (незначительно упрощенная) выглядит так: Создаем таблицы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Заполняем тестовыми данными: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2011, 19:05 |
|
Как создать уникальный ключ для нескольких колонок?
|
|||
---|---|---|---|
#18+
Vano-1981--Следующая строка НЕ вызовет ошибку ограничения уникальности, хотя должна insert into named_values(id_user, id_key, key_value)values(null, 'test', 'test1.1'); insert into named_values(id_user, id_key, key_value)values(null, 'test', 'test1.2'); insert into named_values(id_user, id_key, key_value)values(null, 'tEsT', 'test2');[/src]Ничего она (вам) не должна. В SQL - троичная логика: да, нет и неизвестно. Поэтому используйте null как "неизвестно", а не как "значение по умолчанию". ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2011, 20:09 |
|
Как создать уникальный ключ для нескольких колонок?
|
|||
---|---|---|---|
#18+
Basil A. SidorovVano-1981--Следующая строка НЕ вызовет ошибку ограничения уникальности, хотя должна insert into named_values(id_user, id_key, key_value)values(null, 'test', 'test1.1'); insert into named_values(id_user, id_key, key_value)values(null, 'test', 'test1.2'); insert into named_values(id_user, id_key, key_value)values(null, 'tEsT', 'test2');[/src]Ничего она (вам) не должна. В SQL - троичная логика: да, нет и неизвестно. Поэтому используйте null как "неизвестно", а не как "значение по умолчанию". Блин... так и есть. Что же делать? В Firebird я бы переложил логику на триггер. Может и тут прокати... Просьба кинуть ссылкой на мануал по синтаксису написания триггеров в SQLite. На любом языке, гланое - примеры. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2011, 20:11 |
|
Как создать уникальный ключ для нескольких колонок?
|
|||
---|---|---|---|
#18+
Vano-1981Что же делать?Определите значение "По умолчанию" как default и дело с концом :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2011, 20:21 |
|
Как создать уникальный ключ для нескольких колонок?
|
|||
---|---|---|---|
#18+
Basil A. SidorovVano-1981Что же делать?Определите значение "По умолчанию" как default и дело с концом :) Спасибо за помощь. Попытаюсь сначала триггерами решить задачу. Если не получится, тогда использую метод предложеный Вами. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2011, 11:06 |
|
|
start [/forum/topic.php?fid=54&msg=37264186&tid=2009186]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
84ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
others: | 498ms |
total: | 664ms |
0 / 0 |