Есть таблица, в которй хранятся данные к почтовым серверам для рассылки.
Есть поле 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, причем уже встроенный, не надо создавать отдельный тип.
Но код выше не решает моей проблемы. Вот пример таблицы
Так вот. В колонке isDefault сейчас много нулей и всего одна еденичка. И я хочу, чтобы БД сама проверяла (при вставке или апдейте), что это правило не будет нарушено.
Если я вставлю строку, где isDefault будет равно 1, то база должна мне сказать: хрен тебе, сервер по умолчанию уже установлен. Ну или хотя бы не разрешить вставку.
Но код выше не решает моей проблемы. Вот пример таблицы
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(), но по-моему в мускуле он игнориться, по непонятным причинам
есть ограничение на вставку/обновление 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) | ||
Ты не прав все-таки... Триггеры для того и сделаны, чтобы работать с такими случаями. |
Скорость обработки триггера не намного превосходит неудобства, им создаваемые.
Спустя 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 - это надуманная проблема. Потому что при работе с БД всегда надо про неё (т.е. про саму БД) помнить
Но зато если ты в коде где-то в другом месте захочешь что-то изменить в этой колонке, то тогда тебе придется заново писать весь код. В случае использования триггера один раз сделал - и голова не болит об этом никогда.
Но зато если ты в коде где-то в другом месте захочешь что-то изменить в этой колонке, то тогда тебе придется заново писать весь код. В случае использования триггера один раз сделал - и голова не болит об этом никогда.
_____________
Свои мозги еще никто не отменял.
Телепатов нету.