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

удаляем индекс, апдейтим, возращаем индекс
...
Рейтинг: 0 / 0
UPDATE полей с уникальным индексом
    #39922816
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любой апдейт заменяется на удаление ненужных данных и вставку нужных.
...
Рейтинг: 0 / 0
UPDATE полей с уникальным индексом
    #39922833
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
UPDATE полей с уникальным индексом
    #39922844
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint,

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

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

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

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


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

Не могли бы дать исходные данные, и результат, который хотели бы получить ?
...
Рейтинг: 0 / 0
UPDATE полей с уникальным индексом
    #39923255
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
UPDATE полей с уникальным индексом
    #39923278
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gepard1980,

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

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


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