|
Создание триггера, не позволяющего добавлять в таблицу одинковые записи
|
|||
---|---|---|---|
#18+
Коллеги, всем привет! Встала у меня задача написать такой триггер, который бы при вставке новых записей в таблицу проверял есть ли в таблице уже такая запись и если нет, то добавлял ее в таблицу. Таблица следующая: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
При вставке новых значений уникальность записи в таблице можно выявить составным ключем по полям date и fio . Начинаю писать триггер: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Выскакивают ошибки: Ошибка в запросe (1): cannot create INSTEAD OF trigger on table: main.data1 Ошибка в запросe (1): cannot commit - no transaction is active Если в триггере поменять INSTEAD OF на BEFORE , то выскакивают такие ошибки: Ошибка в запросe (1): near "fio": syntax error Ошибка в запросe (1): cannot commit - no transaction is active Если переписать триггер так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Выскакивают опять ошибки: Ошибка в запросe (1): near "condition_payment": syntax error Ошибка в запросe (1): cannot commit - no transaction is active Никак не пойму, почему идет ругань на последний параметр ... Ругается даже на такое: Код: sql 1. 2. 3. 4. 5.
Пишет: Ошибка в запросe (1): near "RAISE": syntax error Как буд-то команда между BEGIN и END неправильно заканчивается, хотя везде после них стоит точка с запятой. Подскажите, что я делаю неправильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 14:07 |
|
Создание триггера, не позволяющего добавлять в таблицу одинковые записи
|
|||
---|---|---|---|
#18+
hmmm, а зачем триггер?Если при нахождении записи ее нужно заменять то достаточно CONSTRAINT Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 15:12 |
|
Создание триггера, не позволяющего добавлять в таблицу одинковые записи
|
|||
---|---|---|---|
#18+
насколько я помню, хотя могу и ошибаться, INSTEAD OF используется для вьюх ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 15:19 |
|
Создание триггера, не позволяющего добавлять в таблицу одинковые записи
|
|||
---|---|---|---|
#18+
Спасибо на наводку! Что-то мне в голову уперлось триггером это сделать и все тут. Про другие способы даже не подумал. Но вот почему ошибки у меня выскакивают при добавлении триггеров мне всеравно не понятно ... Хотелось бы разобраться в чем я не прав. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 15:39 |
|
Создание триггера, не позволяющего добавлять в таблицу одинковые записи
|
|||
---|---|---|---|
#18+
hmmm, по первому я уже писал насчет INSTEAD OF и таблиц по второму в insert триггерах нельзя использовать OLD, только NEW по RAISE - использовать Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 16:12 |
|
Создание триггера, не позволяющего добавлять в таблицу одинковые записи
|
|||
---|---|---|---|
#18+
pit_alex, Спасибо! Что-то я не подумал, что при INSERT триггере значению OLD неоткуда взяться. С RAISE тоже понятно все. Но у меня осталось маленькое такое неудовлетворение в том, как работает Код: sql 1.
Если так написать при создании таблицы, то в случае добавления новых строк с такими же датами и ФИО происходит обновление существующей в таблице записи + меняет значение первичного ключа id_data , что мне бы не хотелось. В принципе, для данной таблицы такое поведение терпимо, но только до тех пор, пока я не начну заниматься нормализацией данных. Например, решу я сделать справочник по клиентам Код: sql 1. 2. 3. 4. 5. 6.
и в нормализованной таблице data2 буду в поле client хранить id клиента из таблицы clients . Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
То в случае, если мне в таблицу clients попробуют добавить запись с значенниями client_name и email совпадающими с одной из уже имеющихся записей, то у меня перезапишется первичный ключ id . В этом случае, мне необходимо каким-то образом поменять в таблице data2 значение поля client на то, которое будет соответствовать новому id из таблицы clients . Для этого необходимо написать триггер, который бы срабатывал на изменение id и обновлял в таблице data2 значения соответствующих полей client . Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
В общем, нужно логику триггера как-то иначе делать. Как -- пока не знаю. Надеюсь на подсказки и идеи! Использовал следующие тестовые данные: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 11:56 |
|
Создание триггера, не позволяющего добавлять в таблицу одинковые записи
|
|||
---|---|---|---|
#18+
hmmm, много текста неасилил :-) а вообще, при нарушении уникальности можно генерить исключение и обрабатывать на стороне клиента, или все таки обновлять запись в триггере, и потом рейзить тихую ошибку, типа такого Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 12:51 |
|
Создание триггера, не позволяющего добавлять в таблицу одинковые записи
|
|||
---|---|---|---|
#18+
pit_alex, Спасибо! Создаю таблицу: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
И триггер к ней: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Начинаю заносить данные: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
В результате получается супер-таблица! idcoachdatestatusclientstockcostcondition_payment1123113000Все оплачено2234224000Все оплачено3345315000Все оплачено4456426000Все оплачено5567517000Все оплачено6678128000Все оплачено7789219000Все оплачено889103210000Все оплачено9910114111000Все оплачено101011125212000Все оплачено111112131113000Все оплачено121213142214000Все оплачено131314153115000Все оплачено При создании таблицы я не использовал: Код: sql 1.
Если мне надо сделать так, чтобы при каждой вставке строки я смотрел не существует ли у меня уже такая и если существует, то ничего добавлять не надо, тогда мой триггер должен выглядеть следующим образом? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2013, 12:58 |
|
|
start [/forum/topic.php?fid=54&msg=38185335&tid=2008924]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 275ms |
total: | 413ms |
0 / 0 |