Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
SeiOkami
Member

Откуда:
Сообщений: 7
Здравия

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

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

UPDATE _table
SET _Fld = 758283
WHERE
_Fld = 658277

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

Как это можно оптимально сделать ?
6 ноя 18, 13:28    [21725170]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
SeiOkami,

зачем же вы сделали индекс с полем _Fld уникальным,
если этот индекс на самом деле не должен быть уникальным?
6 ноя 18, 13:38    [21725184]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
SeiOkami,

merge

ignore_dup_key
6 ноя 18, 13:40    [21725188]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
invm
Member

Откуда: Москва
Сообщений: 9348
Владислав Колосов
ignore_dup_key
При update?
6 ноя 18, 13:45    [21725201]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
invm
Member

Откуда: Москва
Сообщений: 9348
SeiOkami
Главное, чтобы UPDATE не падал
UPDATE _table
SET _Fld = 758283
WHERE 
_Fld = 658277 and
 not exists(select 1 from _table where _Fld = 758283);
6 ноя 18, 13:49    [21725213]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
SeiOkami
Member

Откуда:
Сообщений: 7
invm,

таблицы разные и с разным составом. Это поле не единственный ключ.
6 ноя 18, 13:54    [21725223]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
invm,

да, слона не приметил, как обычно.
6 ноя 18, 14:12    [21725247]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
invm
Member

Откуда: Москва
Сообщений: 9348
SeiOkami
таблицы разные и с разным составом. Это поле не единственный ключ.
И как это мешает применить показанный способ?
6 ноя 18, 14:21    [21725256]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
SeiOkami
Member

Откуда:
Сообщений: 7
invm,

данный скрипт не заменит ни одной записи в таблице, если найдёт хотя бы одну строчку с указанным полем.
6 ноя 18, 14:42    [21725298]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
invm
Member

Откуда: Москва
Сообщений: 9348
SeiOkami
данный скрипт не заменит ни одной записи в таблице, если найдёт хотя бы одну строчку с указанным полем.
Данный скрипт меняет только одну строку таблицы, если не найдена одна определенная строка в той же таблице. Это следуе из того, что _Fld уникально.
6 ноя 18, 14:47    [21725312]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
msLex
Member

Откуда:
Сообщений: 8091
SeiOkami
таблицы разные и с разным составом. Это поле не единственный ключ.


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

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



Если первое, то либо not exists либо обработка ошибок
Если второе, то только удаление объектов поддержки уникальности (индексы/констреинты)
6 ноя 18, 14:49    [21725317]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
SeiOkami
Member

Откуда:
Сообщений: 7
invm,

в таблице может быть сколько угодно строк. С разными значениями ключевых полей. Поменять нужно у всех строк одно поле
6 ноя 18, 14:50    [21725318]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
SeiOkami
invm,

в таблице может быть сколько угодно строк. С разными значениями ключевых полей. Поменять нужно у всех строк одно поле
Да тут программист нужен, чтобы написать для каждой таблицы правильный запрос.
6 ноя 18, 14:53    [21725322]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
SeiOkami
Member

Откуда:
Сообщений: 7
Гавриленко Сергей Алексеевич,

Задача примитивная. Тупо поменять значение в колонке. Но всё рушит то, что UPDATE не умеет продолжать выполнение при неудачах
6 ноя 18, 14:57    [21725332]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
SeiOkami,

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


В какой ситуации? Обновляется ключ в старой таблице, в данных, которыми обновляете, повторяется значение ключевого поля или что?
6 ноя 18, 14:59    [21725336]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
invm
Member

Откуда: Москва
Сообщений: 9348
SeiOkami
в таблице может быть сколько угодно строк. С разными значениями ключевых полей. Поменять нужно у всех строк одно поле
Продемонстрированный вами скрипт меняет только одну строку в одной таблице.
6 ноя 18, 15:01    [21725342]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
SeiOkami
Member

Откуда:
Сообщений: 7
invm,

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


UPDATE _table
SET _Fld = 758283
WHERE
_Fld = 658277
6 ноя 18, 15:05    [21725347]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
SeiOkami
invm,

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


UPDATE _table
SET _Fld = 758283
WHERE
_Fld = 658277


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

У вас понятие дублирования отличное от общепринятого?
6 ноя 18, 15:06    [21725352]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
invm
Member

Откуда: Москва
Сообщений: 9348
SeiOkami
Однако в каждой из них есть специальное ключевое поле "_Fld"
SeiOkami
Скрипт меняет ВСЕ строки, у которых _Fld = 658277
Противоречия не видите?
6 ноя 18, 15:10    [21725357]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
SeiOkami
Member

Откуда:
Сообщений: 7
TaPaK,

Ещё раз.

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

Например:


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


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

Если поменять значение Поле1 с "2" на "1", что приведет к дублированию при изменении жирной строки
6 ноя 18, 15:11    [21725361]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
SeiOkami,
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 );
6 ноя 18, 15:14    [21725367]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
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);
6 ноя 18, 16:14    [21725465]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
iap
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
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
);
6 ноя 18, 16:17    [21725470]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Так лучше:
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ы, то надо слегка доработать
6 ноя 18, 16:21    [21725477]     Ответить | Цитировать Сообщить модератору
 Re: Замена в таблице значения колонки с игнорированием ошибки дублирования ключевых полей.  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
SeiOkami
Генерим на каждую таблицу скрипт такого рода:
....


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

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
7 ноя 18, 05:57    [21726040]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить