[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Уникальное значение в колонке, остальные побоку
waldicom
Такой вопрос возник.
Есть таблица, в которй хранятся данные к почтовым серверам для рассылки.
Есть поле isDefault, которое имеет два возможных значения: 0 или 1.
Только один сервер может быть назначеным по умолчанию (isDefault = 1). Все остальные должны иметь 0.

Вопрос: как переложить заботу об этом на БД? Триггеры использовать не хотелось бы (религия не позволяет).
Что-то типа ADD CONSTRAINT UNIQUE(1) FOR `isDefault`





Спустя 1 час, 2 минуты, 15 секунд (29.06.2010 - 18:39) glock18 написал(а):
в mysql насколько я знаю, нельзя делать такие индексы. в постгре видел это.

думаю, что в мускуле ничего кроме хранимок/триггеров или логики вне базы не поможет.

Спустя 17 часов, 29 минут, 2 секунды (30.06.2010 - 12:08) sergeiss написал(а):
В Постгре (по крайней мере один из вариантов) такой: создать новый тип данных (типа enum, подобно тому, что есть в Си), и в нем указать 2 величины. А дальше работай с этим типом данных так же, как и с любым другим.

Пример из хэлпа:

8.7.1. Declaration of Enumerated Types
Enum types are created using the CREATE TYPE command, for example:

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
Once created, the enum type can be used in table and function definitions much like any other type:

Example 8.3. Basic Enum Usage

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TABLE person (
name text,
current_mood mood
);
INSERT INTO person VALUES ('Moe', 'happy');
SELECT * FROM person WHERE current_mood = 'happy';
name | current_mood
------+--------------
Moe | happy
(1 row)


И встречный вопросец: а чем триггеры "не угодили"?

Спустя 10 минут, 13 секунд (30.06.2010 - 12:19) waldicom написал(а):
Да не, enum есть и в MySQL, причем уже встроенный, не надо создавать отдельный тип.
Но код выше не решает моей проблемы. Вот пример таблицы


id | servername | host | user | isDefault
1 | server 1 | tyr1 | u1 | 0
2 | server 2 | tyr2 | u2 | 0
3 | server 3 | tyr3 | u3 | 1
4 | server 4 | tyr4 | u4 | 0
5 | server 5 | tyr 5 | u5 | 0


Так вот. В колонке isDefault сейчас много нулей и всего одна еденичка. И я хочу, чтобы БД сама проверяла (при вставке или апдейте), что это правило не будет нарушено.
Если я вставлю строку, где isDefault будет равно 1, то база должна мне сказать: хрен тебе, сервер по умолчанию уже установлен. Ну или хотя бы не разрешить вставку.

Спустя 4 минуты, 33 секунды (30.06.2010 - 12:23) sergeiss написал(а):
А, понял, о чем ты... Ну хорошо. А триггер чем все-таки не нравится?

Спустя 36 минут, 11 секунд (30.06.2010 - 12:59) tomash написал(а):
waldicom
есть ограничение на вставку/обновление CHECK(), но по-моему в мускуле он игнориться, по непонятным причинам

Спустя 13 минут, 22 секунды (30.06.2010 - 13:13) waldicom написал(а):
Цитата (tomash @ 30.06.2010 - 11:59)
waldicom
есть ограничение на вставку/обновление CHECK(), но по-моему в мускуле он игнориться, по непонятным причинам

Да, я читал про "The CHECK clause is parsed but ignored by all storage engines.", но мне знание этого факта не помагает.
В общм сошлись на том, что будем проверять в приложении.

Спустя 14 минут, 26 секунд (30.06.2010 - 13:27) sergeiss написал(а):
Цитата (waldicom @ 30.06.2010 - 14:13)
В общм сошлись на том, что будем проверять в приложении.

Ты не прав все-таки... Триггеры для того и сделаны, чтобы работать с такими случаями.

Спустя 29 минут, 22 секунды (30.06.2010 - 13:56) waldicom написал(а):
Цитата (sergeiss @ 30.06.2010 - 12:27)
Цитата (waldicom @ 30.06.2010 - 14:13)
В общм сошлись на том, что будем проверять в приложении.

Ты не прав все-таки... Триггеры для того и сделаны, чтобы работать с такими случаями.

Скорость обработки триггера не намного превосходит неудобства, им создаваемые.

Спустя 8 минут, 52 секунды (30.06.2010 - 14:05) sergeiss написал(а):
О каких неудобствах триггера ты говоришь???

Спустя 14 минут, 53 секунды (30.06.2010 - 14:20) waldicom написал(а):
Цитата (sergeiss @ 30.06.2010 - 13:05)
О каких неудобствах триггера ты говоришь???

Один из них: о триггере надо помнить, а в коде все видно сразу. Если какая трабла - то появляется дополнительное место, где надо смотреть.

Спустя 17 часов, 41 минута, 50 секунд (1.07.2010 - 08:02) sergeiss написал(а):
waldicom - это надуманная проблема. Потому что при работе с БД всегда надо про неё (т.е. про саму БД) помнить smile.gif
Но зато если ты в коде где-то в другом месте захочешь что-то изменить в этой колонке, то тогда тебе придется заново писать весь код. В случае использования триггера один раз сделал - и голова не болит об этом никогда.


_____________
Свои мозги еще никто не отменял.
Телепатов нету.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.