powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
25 сообщений из 26, страница 1 из 2
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728496
SeiOkami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравия

Такая проблема. Имеется большое число таблиц. Таблицы разные с разными данными и разными ключами. Однако в каждой из них есть специальное ключевое поле "_Fld", значение которого нужно заменить

Генерим на каждую таблицу скрипт такого рода:

UPDATE _table
SET _Fld = 758283
WHERE
_Fld = 658277

Иногда происходит дублирование ключевых полей. Такие ситуации нас не интересуют и можно хоть игнорировать, хоть перезатирать. Не важно. Главное, чтобы UPDATE не падал, а продолжал дальше.

Как это можно оптимально сделать ?
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728503
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkami,

зачем же вы сделали индекс с полем _Fld уникальным,
если этот индекс на самом деле не должен быть уникальным?
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728505
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkami,

merge

ignore_dup_key
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728511
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовignore_dup_keyПри update?
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728520
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkamiГлавное, чтобы UPDATE не падал
Код: sql
1.
2.
3.
4.
5.
UPDATE _table
SET _Fld = 758283
WHERE 
_Fld = 658277 and
 not exists(select 1 from _table where _Fld = 758283);
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728525
SeiOkami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

таблицы разные и с разным составом. Это поле не единственный ключ.
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728539
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

да, слона не приметил, как обычно.
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728543
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkamiтаблицы разные и с разным составом. Это поле не единственный ключ.И как это мешает применить показанный способ?
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728560
SeiOkami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

данный скрипт не заменит ни одной записи в таблице, если найдёт хотя бы одну строчку с указанным полем.
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728569
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkamiданный скрипт не заменит ни одной записи в таблице, если найдёт хотя бы одну строчку с указанным полем.Данный скрипт меняет только одну строку таблицы, если не найдена одна определенная строка в той же таблице. Это следуе из того, что _Fld уникально.
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728573
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkamiтаблицы разные и с разным составом. Это поле не единственный ключ.

Вы что на выходе то получить-то хотите?

Не изменять данные, которые приводят к нарушению уникальности (not exists из примера выше) или игнорировать саму уникальность (иметь неуникальные записи) в уникальном ключе?



Если первое, то либо not exists либо обработка ошибок
Если второе, то только удаление объектов поддержки уникальности (индексы/констреинты)
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728574
SeiOkami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

в таблице может быть сколько угодно строк. С разными значениями ключевых полей. Поменять нужно у всех строк одно поле
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728577
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkamiinvm,

в таблице может быть сколько угодно строк. С разными значениями ключевых полей. Поменять нужно у всех строк одно полеДа тут программист нужен, чтобы написать для каждой таблицы правильный запрос.
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728584
SeiOkami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

Задача примитивная. Тупо поменять значение в колонке. Но всё рушит то, что UPDATE не умеет продолжать выполнение при неудачах
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728587
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkami,

Иногда происходит дублирование ключевых полей.

В какой ситуации? Обновляется ключ в старой таблице, в данных, которыми обновляете, повторяется значение ключевого поля или что?
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728592
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkamiв таблице может быть сколько угодно строк. С разными значениями ключевых полей. Поменять нужно у всех строк одно полеПродемонстрированный вами скрипт меняет только одну строку в одной таблице.
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728595
SeiOkami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Почему же? Скрипт меняет ВСЕ строки, у которых _Fld = 658277


UPDATE _table
SET _Fld = 758283
WHERE
_Fld = 658277
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728598
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkamiinvm,

Почему же? Скрипт меняет ВСЕ строки, у которых _Fld = 658277


UPDATE _table
SET _Fld = 758283
WHERE
_Fld = 658277

авторИногда происходит дублирование ключевых полей.
У вас понятие дублирования отличное от общепринятого?
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728600
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkamiОднако в каждой из них есть специальное ключевое поле "_Fld"SeiOkamiСкрипт меняет ВСЕ строки, у которых _Fld = 658277Противоречия не видите?
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728602
SeiOkami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Ещё раз.

В таблице есть поля. Среди ключевых есть моё поле. Я его меняю. Случаются ситуации, когда это приводит к дублированию.

Например:


Поле1 / Поле2 / Поле3
1 / 1 / 1
2 / 2 / 1
2 / 1 / 1


Поле1 и Поле2 - ключевые.

Если поменять значение Поле1 с "2" на "1", что приведет к дублированию при изменении жирной строки
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728605
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkami,
Код: sql
1.
2.
3.
4.
5.
6.
UPDATE a 
SET _Fld = 758283
FROM _table a 
WHERE 
_Fld = 658277 and
 not exists(select 1 from _table b where _Fld = 758283 AND a.Поле2 = b.Поле2 AND a.Поле3 = b.Поле3 );
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728649
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
UPDATE T
SET T.Поле1=@Value
WHERE NOT EXISTS(SELECT * FROM T TT WHERE TT.ID<>T.ID AND TT.Поле1=@Value AND TT.Поле2=T.Поле2);
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728651
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
Код: sql
1.
2.
3.
UPDATE T
SET T.Поле1=@Value
WHERE NOT EXISTS(SELECT * FROM T TT WHERE TT.ID<>T.ID AND TT.Поле1=@Value AND TT.Поле2=T.Поле2);

Без ID
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE T
SET T.Поле1=@Value
WHERE NOT EXISTS
(
 SELECT *
 FROM T TT
 WHERE (TT.Поле1<>T.Поле1 OR TT.Поле2<>T.Поле2) AND TT.Поле1=@Value AND TT.Поле2=T.Поле2
);
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728655
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так лучше:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
UPDATE T
SET T.Поле1=@Value
WHERE T.Поле1<>@Value
AND NOT EXISTS
(
 SELECT *
 FROM T TT
 WHERE (TT.Поле1<>T.Поле1 OR TT.Поле2<>T.Поле2) AND TT.Поле1=@Value AND TT.Поле2=T.Поле2
);

Если в полях могут быть NULLы, то надо слегка доработать
...
Рейтинг: 0 / 0
Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
    #39728979
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeiOkami Генерим на каждую таблицу скрипт такого рода:
....

Так поменяй порядок сгенерированных запросов, чтобы не было дублирования.
Например:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
With rec as (
Select a._Fld,a._Fld_New,0 as rn 
  from _Changes a
  left join _table b on a._Fld_New= b._Fld
  left join _Changes c on a._Fld= c._Fld_New
 Where b._Fld is null
union all 
Select c._Fld,c._Fld_New,a.rn+1 
  from rec a
  join _Changes c on a._Fld= c._Fld_New
)
Select 'Update #tmp set _Fld = '+cast(_Fld_New as varchar(10))+' Where _Fld = '+cast(_Fld as Varchar(10)) 
  From rec Order by rn
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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