Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Возникла необходимость проапдейтить 2 записи в таблице, на которой есть уникальный индекс. Причем при апдейте первой записи возникает нарушение этой уникальности и апдейт не проходит. Это нарушение не возникало бы, если бы можно было проапдейтить и 1ю и 2ю запись, но до 2го апдейта дело не доходит. Пример таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В реальной таблице FK1 - это референс на другую таблицу Хочется выполнить такие запросы: Код: sql 1. 2. 3. 4. 5. 6. 7. Естественно, 1й апдейт отваливается. Есть какие-нибудь рекомендации, как этого лучше всего добиться? В голову приходят 2 варианта: 1. Вообще убрать уникальный индекс. Но тогда теряется контроль уникальности на уровне БД. 2. Сначала удалить обе записи, потом заинсертить. Тоже вариант не очень нравится - записей может быть и больше двух. Есть еще какие-нибудь варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 14:35 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 14:42 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
court, Спасибо, это конечно сработает, но хотелось бы тогда усложнить вопрос) На самом деле мы апдейтим по одной записи, через хранимку: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Есть ощущение, что с таким подходом искомого результата не добиться, но вдруг все же есть решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 15:30 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
Sergey TSA, Проставить на одном любое значение (99999) потом менять оба. в транзакции отключить констрейн менять включить констрейн ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 15:37 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
Включение констрейнта очень накладно, на больших таблицах однозначно не стоит так делать. Вообще оптимальный вариант это просто создать новую процедуру которая вам сделает нужный апдейт, других приемлемых вариантов нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 15:54 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
TaPaKSergey TSA, Проставить на одном любое значение (99999) потом менять оба. в транзакции отключить констрейн менять включить констрейнНе 99999, а NULL. Тогда и констрейнт отключать не придётся. Естественно, поля FLD1 и FLD2 должны допускать значение NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 16:05 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
iapTaPaKSergey TSA, Проставить на одном любое значение (99999) потом менять оба. в транзакции отключить констрейн менять включить констрейнНе 99999, а NULL. Тогда и констрейнт отключать не придётся. Естественно, поля FLD1 и FLD2 должны допускать значение NULL. ну такого(nullable) по условиям нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 16:17 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
Sergey TSAЕсть ощущение, что с таким подходом искомого результата не добиться, но вдруг все же есть решениеНапример, перепишите так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Тогда, не меняяя логику работы с UpdateTbl1, сможете сделать так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вместо xml можно применить табличный тип, при условии, что его определение не придется менять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 16:23 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
TaPaKПроставить на одном любое значение (99999) потом менять оба.Но наверняка нужно, что бы много пользователей могло выполнить эту процедуру. Поэтому нужно сделать механизм хранения свободных резервных FLD для обмена. А логику реализовать в instead-off триггере :-) Что делать, придётся извращаться, раз накладываются всякие ограничения, типа "На самом деле мы апдейтим по одной записи" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 16:23 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
Всем спасибо! TaPaKiapпропущено... Не 99999, а NULL. Тогда и констрейнт отключать не придётся. Естественно, поля FLD1 и FLD2 должны допускать значение NULL. ну такого(nullable) по условиям нет Ну можно и нулл, но все равно уникальность нарушится, если кто-то еще будет менять другие записи. авторColumns that are used in a unique index should be set to NOT NULL, because multiple null values are considered duplicates when a unique index is created. Владимир ЗатуливетерВключение констрейнта очень накладно, на больших таблицах однозначно не стоит так делать. Вообще оптимальный вариант это просто создать новую процедуру которая вам сделает нужный апдейт, других приемлемых вариантов нет... Вот, я надеялся, что есть и другие простые, приемлемые решения, но видимо придется действительно что-то заковыристое делать, чтобы сразу все записи апдейтились. invm, спасибо, попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 17:04 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
Sergey TSA, авторColumns that are used in a unique index should be set to NOT NULL, because multiple null values are considered duplicates when a unique index is created. не смогли перевести? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 17:05 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
Sergey TSAНу можно и нулл, но все равно уникальность нарушится, если кто-то еще будет менять другие записи. Фильтрованные индексы? Не, не слыхал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 19:39 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
Sergey TSAХочется выполнить такие запросы: Код: sql 1. 2. 3. 4. 5. 6. 7. А можно узнать, что за задача у вас. По сути вам нужно поменять местами два id при этом отдельными запросами (что без третьего id невозможно). Но я не могу придумать зачем бы мне такое было нужно на постоянной основе. Или это у вас разовая акция? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 22:11 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
PizzaPizzaНо я не могу придумать зачем бы мне такое было нужно Ээээ, батенька, больное воображение иных "архитекторов" ишо не такие кундштюки может придумывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2018, 05:57 |
|
||
|
Апдейт записей в таблице с уникальным индексом
|
|||
|---|---|---|---|
|
#18+
aleks222PizzaPizzaНо я не могу придумать зачем бы мне такое было нужно Ээээ, батенька, больное воображение иных "архитекторов" ишо не такие кундштюки может придумывать.Например, уникальное поле сортировки (приоритета) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2018, 11:01 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39708780&tid=1689043]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
7ms |
get forum data: |
4ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 363ms |

| 0 / 0 |
