Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / UPDATE полей с уникальным индексом / 21 сообщений из 21, страница 1 из 1
05.02.2020, 13:01
    #39922808
gepard1980
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
Приветствую! Есть таблица связи задач, тэгов, пользователей. На ней есть уникальный индекс (id_task, id_tag, id_user). Требуется заменить в строках одного пользователя на другого, и при этом не нарушить уникальный индекс.
...
Рейтинг: 0 / 0
05.02.2020, 13:08
    #39922810
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
gepard1980,

удаляем индекс, апдейтим, возращаем индекс
...
Рейтинг: 0 / 0
05.02.2020, 13:16
    #39922816
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
Любой апдейт заменяется на удаление ненужных данных и вставку нужных.
...
Рейтинг: 0 / 0
05.02.2020, 13:49
    #39922833
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
gepard1980,

Гавриленко Сергей Алексеевич
Любой апдейт заменяется на удаление ненужных данных и вставку нужных.


Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
DECLARE @id_user_1 INT = 1
      , @id_user_2 INT = 2;
DECLARE @t AS TABLE
                    (id_task       INT NOT NULL
                   , id_tag        INT NOT NULL
                   , id_user       INT NOT NULL
                   , [Комментарий] VARCHAR(30) NOT NULL -- поле только для демонстрации
                   , UNIQUE(id_task, id_tag, id_user)
                    ); 

INSERT INTO @t
                    (id_task 
                   , id_tag  
                   , id_user
			    , [Комментарий] )
SELECT   1, 1, @id_user_1, '1 комментарий' UNION ALL
SELECT   1, 1, @id_user_2, '2 комментарий' UNION ALL
SELECT   2, 1, @id_user_1, '3 комментарий' UNION ALL
SELECT   2, 1, @id_user_2, '4 комментарий' 

SELECT * FROM @t

DELETE FROM @t
OUTPUT 
       DELETED.id_task
     , DELETED.id_tag
     , IIF(DELETED.id_user = @id_user_1, @id_user_2, @id_user_1)
     , DELETED.[Комментарий]
       INTO @t(
            id_task
          , id_tag
          , id_user
          , [Комментарий])
WHERE 
      id_user IN(@id_user_1, @id_user_2);

SELECT * FROM @t;
...
Рейтинг: 0 / 0
05.02.2020, 14:00
    #39922844
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
entrypoint,

и наличие референсов не смутит никого
...
Рейтинг: 0 / 0
05.02.2020, 15:03
    #39922903
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
Гавриленко Сергей Алексеевич
Любой апдейт заменяется на удаление ненужных данных и вставку нужных.
Это было бы слишком жестоко :)
Заменяется только при изменение ключа индекса.
...
Рейтинг: 0 / 0
05.02.2020, 15:05
    #39922906
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
invm
Гавриленко Сергей Алексеевич
Любой апдейт заменяется на удаление ненужных данных и вставку нужных.
Это было бы слишком жестоко :)
Заменяется только при изменение ключа индекса.
Я имел ввиду, что можно заменить, а не что это происходит всегда.
...
Рейтинг: 0 / 0
05.02.2020, 15:31
    #39922955
gepard1980
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
В таблице 3 млн строк и нагрузка примерно 2 тысячи транзакций в секунду. Удаление индекса и перестройка индекса не подходят. Попробую удалить сначала, потом вставить.
...
Рейтинг: 0 / 0
05.02.2020, 15:43
    #39922967
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
gepard1980
В таблице 3 млн строк и нагрузка примерно 2 тысячи транзакций в секунду. Удаление индекса и перестройка индекса не подходят. Попробую удалить сначала, потом вставить.

я воспользовался калькулятором и сделал вывод - вы врёте
...
Рейтинг: 0 / 0
05.02.2020, 15:45
    #39922970
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
gepard1980
В таблице 3 млн строк и нагрузка примерно 2 тысячи транзакций в секунду. Удаление индекса и перестройка индекса не подходят. Попробую удалить сначала, потом вставить.

Вы это вот все всерьез сейчас?
Вы хотя бы на тестовом сервере попробуйте.
...
Рейтинг: 0 / 0
05.02.2020, 16:01
    #39922983
gepard1980
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
Запустил сейчас не на боевом сервере, выполнил последовательно DROP INDEX и CREATE UNIQUE INDEX. По времени заняло полторы минуты. Это много или мало? Для веба дак много по-моему.
...
Рейтинг: 0 / 0
05.02.2020, 16:03
    #39922987
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
автородного пользователя на другого
3 update через "левого" пользователя
...
Рейтинг: 0 / 0
05.02.2020, 16:16
    #39922994
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
gepard1980,

А точно есть проблема, так же работает ?

Код: 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.
26.
27.
28.
29.
DECLARE @id_user_1 INT = 1
      , @id_user_2 INT = 2;

DECLARE @t AS TABLE
                    (id_task       INT NOT NULL
                   , id_tag        INT NOT NULL
                   , id_user       INT NOT NULL
                   , [Комментарий] VARCHAR(30) NOT NULL -- поле только для демонстрации
                   , UNIQUE (id_task, id_tag, id_user)
                    ); 

INSERT INTO @t
                    (id_task 
                   , id_tag  
                   , id_user
			    , [Комментарий] )
SELECT   1, 1, @id_user_1, '1 комментарий' UNION ALL
SELECT   1, 1, @id_user_2, '2 комментарий' UNION ALL
SELECT   2, 1, @id_user_1, '3 комментарий' UNION ALL
SELECT   2, 1, @id_user_2, '4 комментарий' 

SELECT * FROM @t

UPDATE @t
      SET id_user = IIF(id_user = @id_user_1, @id_user_2, @id_user_1)
WHERE 
      id_user IN(@id_user_1, @id_user_2);

SELECT * FROM @t;
...
Рейтинг: 0 / 0
05.02.2020, 16:21
    #39922998
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
gepard1980
Требуется заменить в строках одного пользователя на другого, и при этом не нарушить уникальный индекс.
Менять нужно в рамках одной инструкции. Тогда ничего не нарушится
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare @t table (id int primary key, a int unique);
insert into @t
values
 (1, 1), (2, 2);

select * from @t order by id;

declare @a1 int = 2, @a2 int = 1;

update @t
 set
  a = case when a = @a1 then @a2 else @a1 end
where
 a in (@a1, @a2);

select * from @t order by id;
...
Рейтинг: 0 / 0
05.02.2020, 16:22
    #39922999
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
invm,

)))))))
22073998
...
Рейтинг: 0 / 0
06.02.2020, 10:26
    #39923223
gepard1980
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
entrypoint, у меня MS SQL 2008R2, поэтому заменил IIF на CASE. Всё так, ваш пример работает, но может неясно описал условия задачи - нужно не местами поменять, а заменить скажем id_user_1 на id_user_2. при этом уже в базе может существовать id_task, id_tag, id_user, а присутствует уникальный индекс.
...
Рейтинг: 0 / 0
06.02.2020, 10:50
    #39923244
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
gepard1980
entrypoint, у меня MS SQL 2008R2, поэтому заменил IIF на CASE. Всё так, ваш пример работает, но может неясно описал условия задачи - нужно не местами поменять, а заменить скажем id_user_1 на id_user_2. при этом уже в базе может существовать id_task, id_tag, id_user, а присутствует уникальный индекс.


Да, действительно не очень понятно. Кажется , что пример именно и делает то, что требуется.

Не могли бы дать исходные данные, и результат, который хотели бы получить ?
...
Рейтинг: 0 / 0
06.02.2020, 11:02
    #39923255
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
gepard1980
нужно не местами поменять, а заменить скажем id_user_1 на id_user_2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
update t
 set
  id_user = @id_user2
from
 Таблица t
where
 id_user = @id_user1 and
 not exists(select 1 from Таблица where id_task = t.id_task and id_tag = t.id_tag and id_user = @id_user2);
...
Рейтинг: 0 / 0
06.02.2020, 11:31
    #39923278
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
gepard1980,

Насколько я понял может возникнуть ситуация, когда 1 -> 2 2 -> 1.

А как поведет себя MERGE ?
...
Рейтинг: 0 / 0
06.02.2020, 15:42
    #39923498
gepard1980
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
invm, благодарю! То что нужно!
...
Рейтинг: 0 / 0
06.02.2020, 15:42
    #39923499
gepard1980
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE полей с уникальным индексом
Всех благодарю кто пытался помочь!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / UPDATE полей с уникальным индексом / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]