|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
Здравствуйте. Есть жирная таблица с четырьмя полями. Все они добавлены в ключ. Скрипт создания таблицы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Версия сервера на всякий случай Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49 Copyright (C) 2017 Microsoft Corporation Enterprise Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor) Необходимо изменить значение в одном из полей . При этом, если при изменении подразумевается дублирование , то эту строку , в которой пытаемся изменить, нужно удалить (ведь подразумеваемый набор значений во всех полях уже есть). Пытаюсь пока делать обычный запрос, Код: sql 1. 2. 3. 4. 5. 6. 7.
но, как и ожидалось, получаю ошибку: текст ошибкиViolation of PRIMARY KEY constraint 'PK_PartnerAnalogs_test'. Cannot insert duplicate key in object 'dbo.PartnerAnalogs_test'. The duplicate key value is (TOYOTA, 43215-P0100, NISSAN, 43215-52L60). Возможно ли вообще выполнить это задание? На первый взгляд, оно не относится уж к таким редким, ИМХО... Пытался смотреть в сторону Merge, но в данном случае не знаю можно ли его использовать. Уже перекурил кучу информации, сильным спецом в SQL себя пока не считаю, разве что поверхностным. Но вот нужно выполнить такую задачу. З.Ы. Параллельно стоит задача удалить из полей различные специальные символы и пробелы, но, я так полагаю, что с этой задачей вторая явно пересекается... :) З.З.Ы. Буду рад любым идеям. Сильно не пинайте по возможности. Заранее благодарю откликнувшихся... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 16:51 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik На первый взгляд, оно не относится уж к таким редким Обычно, если надо обновить поле, являющееся ключом, то уже что-то пошло не так или неправильно спроектировано. Ключ на все поля - это печально. Не делайте так. Один из вариантов решения - сгенерите времянку со старым и новым значениями. Потом проверьте "дубли" и удалите их. А оставшимся обновите. Для консистентности - в одной транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 16:59 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
Ключ на все поля - это печально. Не делайте так. Условия уже есть, надо выполнить задачу. Ключи по всем полям, видимо, делали для уникальности значений в каждой строке... Один из вариантов решения - сгенерите времянку со старым и новым значениями. Потом проверьте "дубли" и удалите их. А оставшимся обновите. Для консистентности - в одной транзакции. Я извиняюсь, но, если не сложно, можно подробней. Я не силен в скульном диалекте и в SQL тоже. К сожалению, и надеюсь, что пока. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 17:34 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik, Если по-простому, то if exists (select * from T where ...=@new) then delete from T where ...=@old else update set ..=@new where ...=@old Если по сложному, то merge ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 17:52 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
Я вообще что-то не вкурил. Если ключ по всем полям (допустим их два) и у меня есть запись {"foo", "bar"}, то нужно при добавлении записи {"foo", "bar"} ту запись {"foo", "bar"}, которая уже есть удалить, что ли? Смысл какой? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 17:55 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
godsql Если по-простому, то... Подозреваю, что будет очень долго. Если по сложному, то merge А вот с Merge я пытался, но так у меня ничего и не получилось сделать. Думаю. что этот способ должен быть быстрее на такой жирной таблице... Был бы рад примерам... Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 17:57 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik Был бы рад примерам Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:02 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik Необходимо изменить значение в одном из полей . При этом, если при изменении подразумевается дублирование , то эту строку , в которой пытаемся изменить, нужно удалить (ведь подразумеваемый набор значений во всех полях уже есть). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:06 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
fkthat Я вообще что-то не вкурил. Если ключ по всем полям (допустим их два) и у меня есть запись {"foo", "bar"}, то нужно при добавлении записи {"foo", "bar"} ту запись {"foo", "bar"}, которая уже есть удалить, что ли? Смысл какой? Смысл в изменении . Если есть записи: brandarticlea_branda_articleMITSUBISHI125MITSUBISHIMD312639BOSCH0 092 S40 260BOSCH0092S40260BOSCH0 092 S40 260VARTA5704120633132BOSCH0 242 129 515CHAMPIONOE201/T10BOSCH125MITSUBISHIMD312639 И я хочу изменить значения в поле brand с MITSUBISHI на BOSCH, то возникнет ошибка. Ибо изменяемая первая строка будет после изменения идентична последней. В таком случае я хотел, чтобы первая строка была просто удалена ибо результат изменения уже есть в базе... Как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:07 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
PaulYoung SerPaNik Необходимо изменить значение в одном из полей . При этом, если при изменении подразумевается дублирование , то эту строку , в которой пытаемся изменить, нужно удалить (ведь подразумеваемый набор значений во всех полях уже есть). Не запись есть, а такое сочетание значения полей. Но мы же в другой строке меняем, вот ее и удалить... Ключи ведь по всем полям... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:09 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik PaulYoung пропущено... Похоже, что нужно просто ничего не делать в этом случае, ведь сами же пишете, что такая запись уже есть в вашей таблице и дублей быть не должно. Не запись есть, а такое сочетание значения полей. Но мы же в другой строке меняем, вот ее и удалить... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:12 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
Надо добавить нормальное уникальное поле, сделать его первичным ключом, в триггере AFTER UPDATE удалить записи с задублированными полями с не минимальным первичным ключом. Ведь я могу проапдейтить зараз 100500 записей, после чего получится сто тыщ записей с одинаковыми значениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:26 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik Не запись есть, а такое сочетание значения полей. Но мы же в другой строке меняем, вот ее и удалить... Ключи ведь по всем полям... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:29 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
invm Ответов не читаем? Конечно читаем. Я просто пока отвечаю на одно, не вижу, что пришел ответ. Ваш проверяю и пытаюсь понять смысл, чтобы разобраться. С учетом моих скудных знаний. :) В любом случае спасибо... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:33 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
PaulYoung, Логика в том, что криво добавили записи из CSV. Поэтому приходиться подчищать. Но это в моем случае. И в чем плоха логика и изменить на нужные значения поля в строке и при этом избежать дублирования (т.е. ошибок в моем случае с ключами по всем полям)? При изменении значения, если дубля не предполагается, то изменить, а если дубль после изменения предполагается, то удалить изменяемую, потому что аналогичная уже есть. Вроде логика нормальная... З.Ы. Это таблица аналогов запчастей. т.е. производитель, артикул, производитель аналога, и артикул аналога. Может эта информация поможет понять, почему я так думал сделать... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:38 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik, у вас в CSV "сырые" данные? а каталог запчастей нормализован и хранится отдельно? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:44 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
PaulYoung, я пытаюсь помочь исправить ситуацию на данный момент. В csv прислали данные, которые нужно было загрузить. Корректность их никто не проверял. Так и загрузили. Теперь нужно исправить ситуацию. Но эта инфа ведь не относится к сабжу. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:52 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
invm, Большущее Вам спасибо! Проверил. То, что нужно! З.Ы. Тут нет системы плюсиков насколько я понял. Так бы с огромным удовольствием "влепил" бы за помощь! :) Еще раз спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 19:00 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
Не хочу создавать новую тему, но как в моем случае очистить все значения в поле от различных символов? Например, -()*;'@ и т.д. Операция изменения проходит нормально, спасибо еще раз. А вот какой запустить скрипт, чтобы очистил от этих спецсимволов и пробелов все значения в определенном поле например? Хорошо бы, если бы множество этих символов можно было задать. Напоминаю, в моем случае составной ключ по всем полям и опять же надо избежать ошибки дублирования... Забыл сказать спасибо так же godsql за код. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 12:52 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik, К сожалению, нормальный translate в sql server не завезли, но можно так. Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 14:04 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
Пример. #T - таблица со строками, @CharsForErase - строка с символами, которые надо удалить из всех строк. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Вместо master.dbo.spt_values годится любой источник достаточного количества целых чисел. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 15:13 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
env, спасибо. попробую проверить :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 16:36 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
iap, спасибо, вот тут нужно будет мне больше времени, чтобы понять. А еще как сделать так, чтобы и ошибок на ключ не возникало :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 16:38 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
env, Хорошо чистит, еще раз спасибо. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 18:01 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
Пытаюсь срастить запрос изменения с обходом ошибки ключа со строкой удаления спецсимоволов. Код: sql 1. 2. 3. 4. 5. 6. 7.
Синтаксис вроде правильный, но выскакивает ошибка при выполнении: "Invalid column name 'brand'" З.Ы. Напомню. С SQL пока разговариваю на жестах... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 18:36 |
|
|
start [/forum/topic.php?fid=46&msg=40020841&tid=1685377]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 165ms |
0 / 0 |