|
Модераторы: Akella |
|
ZVano |
|
||||||||
Опытный Профиль Группа: Участник Сообщений: 258 Регистрация: 11.12.2006 Где: Украина, Кривой Р ог Репутация: нет Всего: 4 |
Делаю локальную БД для хранения натроек пользователя.
Необходимо наложить заклинание уникальности на комбинацию из двух полей. При этом одно из полей может иметь значение NULL. Краткое описание:
Скрипт создания БД.
Скрипт заполнения созданой БД тестовыми значениями.
В результате таблица named_values будет содержать такие данные:
В строках 5, 6 явное нарушение PRIMARY KEY, а в строке 7 конфликт по COLLATE NOCASE (для заккоментированой строчки UNIQUE) У кого какие соображения по данной проблемме? Как реализовать проверку уникальности на уровне БД? Это сообщение отредактировал(а) ZVano - 12.5.2011, 16:34 -------------------- НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению. Гуглим "Как правильно задавать вопросы" |
||||||||
|
|||||||||
ZVano |
|
||||
Опытный Профиль Группа: Участник Сообщений: 258 Регистрация: 11.12.2006 Где: Украина, Кривой Р ог Репутация: нет Всего: 4 |
Народ, неужели никто не сталкивался с этой проблеммой?
Может, непонятно изложена суть проблеммы... Тогда попробую привести наипростейший пример. Тестовый скрипт
Вывод
-------------------- НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению. Гуглим "Как правильно задавать вопросы" |
||||
|
|||||
Gluttton |
|
|||
Начинающий Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: нет Всего: 54 |
ZVano, никаких мыслей не возникает.
А все ли команды скрипта выполняются успешно? Что в логах? -------------------- Слава Україні! |
|||
|
||||
ZVano |
|
|||
Опытный Профиль Группа: Участник Сообщений: 258 Регистрация: 11.12.2006 Где: Украина, Кривой Р ог Репутация: нет Всего: 4 |
Команды создания БД выполняются успешно. В ответ получаю время выполнения скрипта. Команда добавления дубликатов по полю "id_key" при "id_user" is NULL выполняется без ошибок. В ответ получаю время выполнения скрипта. Команда добавления дубликатов по полям "id_key" и "id_user" вызывает ошибку. При выполнении запроса произошла ошибка: columns id_user, id_key are not unique Вобщем то с причиной разобрался. Подсказал "Basil A. Sidorov":: null ничему не равен. В том числе - другому null. Соответственно, и не отрабатывает ни PRIMARY KEY, ни UNIQUE т.к. они не могут сравнить между собой два NULL-а. В других СУБД (напр. Firebird) нельзя создать ни PRIMARY KEY, ни UNIQUE INDEX по полям, которые могут хранить NULL. Т.е. в SQLite недоработка в том, что он вообще позволяет создавать такие ключи. Ну, а выходов из ситуации два: 1. Пометить "id_user" как NOT NULL. И завести в справочнике пользователей псевдопользователя "default", на которого и ссылаться. 2. Не создавать уникальных индексов, а логику переложить на триггера BEFORE INSERT и BEFORE UPDATE. Они обязаны проверить наличие дубликатов и откатить операцию, если таковые найдены. Собираюсь использовать 2й подход. Правда, с синтаксисом DDL SQLite знаком весьма слабо. Это сообщение отредактировал(а) ZVano - 17.5.2011, 10:04 -------------------- НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению. Гуглим "Как правильно задавать вопросы" |
|||
|
||||
Gluttton |
|
||||||||||||
Начинающий Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: нет Всего: 54 |
Да! А я это как то и пропустил...
В MS SQL вообще NULL настраиваемый - ужос!
Я так делаю, когда нужно обеспечить ссылочную целостность и одновременно разрешить отсутствие ввода информации (только вместо default я пишу unknown).
Эмм... Ну как бы тоже вариант, но я например за более простой первый вариант .
Главное начать ;) . Несколько раз пытался подступиться к SQLite, но постоянно какие то мелкие трудности меня от него отталкивали. В качестве встраиваемой БД я остановился на embeded Firebird - в самом простом случае это одна *.dll (в более сложных, несколько). -------------------- Слава Україні! |
||||||||||||
|
|||||||||||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Другие СУБД | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |