Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
В таблице группа полей обозначена как UNIQUE. Естественно, при вставке строк с таким же набором полей вставка не происходит. Меня это не устраивает, нужно чтобы в строке с тем же набором полей в данном случае инкрементировался счетчик. Как это можно реализовать без триггеров и вообще только средствами SQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 10:58 |
|
||
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
Первое, что приходит на ум (если без тригеров) : 1) select'ом перед вставкой проверяшь есть ли такой набор 2) если есть увеличиваешь счетчик у нужной строки 3) если нет вставляешь новую строку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 11:06 |
|
||
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
В хранимой процедуре делаем update(увеличиваем счетчик) с условием по уникальным полям Проверяем если не изменено ни одной строки делаем insert Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:58 |
|
||
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
Ясно. Теперь то же самое, но из клиента на С. авторwsprintf(lpOut, "INSERT INTO lrtes_log VALUES (%s)", lpEscStr); res = PQexec(conn, lpOut); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 17:04 |
|
||
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
где pEscStr формируется динамически. Где поместить обработчик, если вставка не произошла по причине UNIQUE полей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 17:06 |
|
||
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
сделать аналогично ZemA's варианту Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. PS. может лучше юзать PQexecParams() ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 18:11 |
|
||
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
оба варианта стремные, первый потому что во время выполнения if(PQcmdTuples(res) = 0) может уйти запрос res = PQexec(conn, "update..."); от точно такогоже процеса... соотвественно последний упадет с ошибкой наруения uniq. спасет лок на таблицу целиком перед апдейтом но это не стандартный скуэль.. вроде. второй способ стремный потому как если придется выискивать конкретную ошибку о том что конкретно UNIQ сломался.. кто-то дает гарантии что текс месаги не поменяется и никто локаль не сменит? и есть еще один минус.. если это все в большой транзакции идет то она обламается .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 19:04 |
|
||
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 19:23 |
|
||
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
да епрст ZemAВ хранимой процедуре делаем update(увеличиваем счетчик) с условием по уникальным полям Проверяем если не изменено ни одной строки делаем insert Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2006, 09:36 |
|
||
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
ZemA Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Тока тут есть проблеммка, правда больше теоретическая (хотя на сколько она станет практической, зависит от нагрузки на сервер) : если две транзакции начнуться одновременно (вернее даже, если во время выполнения этой функции запуститься еще одна), у вас в таблице, после обеих коммитов появиться две строки со значением counter = 1 !!! И если у нас стоит uniq то та транзакция что закончиться последней - выдаст ошибку и не сработает! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2006, 18:18 |
|
||
|
Обработчик вставки UNIQUE значений
|
|||
|---|---|---|---|
|
#18+
Если проверка уникальности полей сделана через индекс, то можно пропробовать всё реализовать через хранимую процедуру. Вот прототип функции. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. автор=wbearвторой способ стремный потому как если придется выискивать конкретную ошибку о том что конкретно UNIQ сломался.. кто-то дает гарантии что текс месаги не поменяется и никто локаль не сменит? и есть еще один минус.. если это все в большой транзакции идет то она обламается .. в вышеприведенном случае транзакция не обломается. Единственно узкое место тут - это получение информации, что именно по требуемому индексу произошло исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 14:25 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=309&tid=2005916]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 259ms |
| total: | 403ms |

| 0 / 0 |
