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

Откуда:
Сообщений: 203
Доброго времени суток. Вот сделал такую выборку как на картинке, джойнил две таблицы.
Картинка с другого сайта.
Я хочу поменять значения столбцов id и point_id в этих двух таблицах, но чтобы первое значение этих столбцов начиналось например с 50000. Можете подсказать, как такое проще сделать ?
21 ноя 15, 17:00    [18452376]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Поменять конечно же, опечатка.
21 ноя 15, 17:45    [18452473]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
Ondayl,

у вас на картинке одна таблица.

поменять значения столбцов можно только в одной таблице за одну операцию update

предоставьте код запроса который вы имели ввиду который выводит приведенные вами результирующий набор
21 ноя 15, 18:09    [18452524]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

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

SELECT PT.id, DT.point_id
FROM [BN_PATP_DISTR].[dbo].[PATP_Points] AS PT
INNER JOIN [BN_PATP_DISTR].[dbo].[PATP_MarshrutData] AS DT
ON PT.id = DT.point_id
WHERE DT.mList_id = 323
21 ноя 15, 18:17    [18452547]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
Ondayl,

DECLARE @x NUMERIC(15, 0)
DECLARE @tbl TABLE (prev_id NUMERIC(15, 0), new_id NUMERIC(15, 0))

SELECT @x = 50000 - ISNULL(MIN(tmp.point_id), 0) FROM [BN_PATP_DISTR].[dbo].[PATP_MarshrutData] tmp WHERE tmp.mList_id = 323

UPDATE tmp
   SET tmp.point_id = @x + tmp.point_id
OUTPUT DELETED.point_id, INSERTED.point_id INTO @tbl (prev_id, new_id)
FROM [BN_PATP_DISTR].[dbo].[PATP_MarshrutData] tmp
WHERE 1=1
  AND tmp.mList_id = 323

UPDATE tmp
   SET tmp.id = t.new_id
FROM [BN_PATP_DISTR].[dbo].[PATP_Points] tmp
    JOIN @tbl t ON t.prev_id = tmp.id
WHERE 1=1

SELECT
      PT.id,
      DT.point_id
FROM [BN_PATP_DISTR].[dbo].[PATP_Points] AS PT
    INNER JOIN [BN_PATP_DISTR].[dbo].[PATP_MarshrutData] AS DT ON PT.id = DT.point_id
WHERE DT.mList_id = 323
21 ноя 15, 18:37    [18452620]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

Откуда:
Сообщений: 203
felix_ff, спасибо, получилось так, что id поменялись только в одной таблице. А нужно в обеих.

К сообщению приложен файл. Размер - 9Kb
21 ноя 15, 22:25    [18453420]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
Ondayl,

не может такого быть. вы выполнили апдейт точно полным запросом который я привел?

не отдельно каждую инструкцию а именно одним пакетом?
22 ноя 15, 03:35    [18454626]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

Откуда:
Сообщений: 203
felix_ff, полным запросом. Судя по всему это проходит потому что поле id - identity .
22 ноя 15, 13:41    [18455188]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Msg 8102, Level 16, State 1, Line 48
Cannot update identity column 'id'.

Ну да, так и есть. Как быть ?
22 ноя 15, 14:00    [18455258]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Попробую изловчиться пересоздав таблицу.
22 ноя 15, 14:06    [18455281]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

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

да, спасибо, все работает. Только просьба, вы бы не могли прокомментировать скрипт чтобы понять логику его работы, я тогда сам попытаюсь сделать тоже самое, но с другими таблицами.
22 ноя 15, 18:10    [18456100]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
Ondayl,

а что тут комментировать? вы хотели поменять в двух таблицах связанных по id, point_id их значения что бы они начинались с 50000 и.т.д.

делается в два апдейта, сначала одна таблица, потом другая.

находим минимальный идентификатор из первой таблицы и от 50000 отнимаем его - это будет значение приращения для всех идентификаторов в дальнейшем если мы хотим получить чтобы их значения были больше 50000

поскольку я не знаю что может хранить таблица [BN_PATP_DISTR].[dbo].[PATP_Points] я решил перестраховаться и не приводить пример сплошного апдейта без привязки к таблице [BN_PATP_DISTR].[dbo].[PATP_MarshrutData]

поэтому чтобы не потерять связь между двумя таблицами в операции апдейта [BN_PATP_DISTR].[dbo].[PATP_MarshrutData] мы заносим во временный буфер значение прошлого идентификатора который меняем и новое значение

так как в вашем селекте есть условие отбора строк по столбцу mList_ID первой апдейтим таблицу которая ограничивает результирующий набор данным условием

потом просто апдейтим таблицу [BN_PATP_DISTR].[dbo].[PATP_Points] связав ее с временным буфером

+
у меня плохо получается объяснять :/
22 ноя 15, 19:40    [18456498]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

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

Пытаюсь проделать тоже, но одна из таблиц уже другая, и не получается.

Скелет вот такой:

SELECT POI.stop_id, BPOI.id FROM [BN_PATP_DISTR].[dbo].[PATP_Points] AS POI
INNER JOIN [BN_PATP_DISTR].[dbo].[PATP_BasePoint] AS BPOI
ON POI.stop_id = BPOI.id

Делаю так:

DECLARE @x NUMERIC(15, 0)
DECLARE @tbl TABLE (prev_id NUMERIC(15, 0), new_id NUMERIC(15, 0))

SELECT @x = 10000 - ISNULL(MIN(tmp.id), 0) FROM [BN_PATP_DISTR].[dbo].[PATP_BasePoint]

UPDATE tmp
SET tmp.id = @x + tmp.id
OUTPUT DELETED.id, INSERTED.id INTO @tbl (prev_id, new_id)
FROM [BN_PATP_DISTR].[dbo].[PATP_BasePoint] tmp
WHERE 1=1

UPDATE tmp
SET tmp.stop_id = t.new_id
FROM [BN_PATP_DISTR].[dbo].[PATP_Points] tmp
JOIN @tbl t ON t.prev_id = tmp.id
WHERE 1=1

Получаю:

Msg 4104, Level 16, State 1, Line 11
The multi-part identifier "tmp.id" could not be bound.
23 ноя 15, 09:50    [18457887]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ondayl
Msg 4104, Level 16, State 1, Line 11
The multi-part identifier "tmp.id" could not be bound.

И какая команда у вас находится в строке 11 ?

ЗЫ
В SET-ах в левой части выражения не надо писать алиасов.
Потому что изменять можно только поля той таблицы, что указана в UPDATE
23 ноя 15, 09:57    [18457915]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
SELECT @x = 10000 - ISNULL(MIN(tmp.id), 0) FROM [BN_PATP_DISTR].[dbo].[PATP_BasePoint]


а алиас тогда где? пишите или без него или указывайте после названия таблицы
23 ноя 15, 11:11    [18458271]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Можно настроить каскадное обновление внешнего ключа.
23 ноя 15, 12:31    [18458888]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

Откуда:
Сообщений: 203
felix_ff, ну да, извиняюсь, пропустил, глаз замылился совсем.

Владислав Колосов, подскажите как ?
25 ноя 15, 12:39    [18470260]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Владислав Колосов
Member

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

в каком смысле - как?
командой SQL ALTER TABLE или построителем таблиц.
25 ноя 15, 13:50    [18470710]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Владислав Колосов,

а сами то айдишники не меняются все равно.

Сообщение 8102, уровень 16, состояние 1, строка 1
Не удалось изменить столбец идентификаторов "id".


Что я не так делаю ?
11 дек 15, 14:26    [18546569]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
o-o
Guest
Ondayl
Владислав Колосов,

а сами то айдишники не меняются все равно.

Сообщение 8102, уровень 16, состояние 1, строка 1
Не удалось изменить столбец идентификаторов "id".


Что я не так делаю ?

8102: Cannot update identity column '%.*ls'.
вы апдэйтите identity.
11 дек 15, 14:32    [18546607]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Помогите еще раз пожалуйста.

Вот такой стейтмент:

SELECT MT.id, MTLS.id, MTLS.Marshrut_id,MTData.mList_id
FROM [BN_PATP_DISTR].[dbo].[PATP_Marshruts] as MT
INNER JOIN [BN_PATP_DISTR].[dbo].[PATP_MarshrutList] as MTLS
ON MT.id = MTLS.Marshrut_id
INNER JOIN [BN_PATP_DISTR].[dbo].[PATP_MarshrutData] as MTData
ON MTLS.id = MTData.mList_id

Обновляю вот так, не все столбцы обновляются почему то:

DECLARE @x NUMERIC(15, 0)
DECLARE @tbl TABLE (prev_id NUMERIC(15, 0), new_id NUMERIC(15, 0))

SELECT @x = 700 - ISNULL(MIN(tmp.point_id), 0) FROM [BN_PATP_DISTR].[dbo].[PATP_MarshrutData] tmp

UPDATE tmp
SET tmp.id = @x + tmp.id
OUTPUT DELETED.id, INSERTED.id INTO @tbl (prev_id, new_id)
FROM [BN_PATP_DISTR].[dbo].[PATP_Marshruts] tmp
WHERE 1=1

UPDATE tmp
SET tmp.id = t.new_id
FROM [BN_PATP_DISTR].[dbo].[PATP_MarshrutList] tmp
JOIN @tbl t ON t.prev_id = tmp.id
WHERE 1=1

UPDATE tmp
SET tmp.mList_id = t.new_id
FROM [BN_PATP_DISTR].[dbo].[PATP_MarshrutData] tmp
JOIN @tbl t ON t.prev_id = tmp.mList_id
WHERE 1=1

UPDATE tmp
SET tmp.Marshrut_id = t.new_id
FROM [BN_PATP_DISTR].[dbo].[PATP_MarshrutList] tmp
JOIN @tbl t ON t.prev_id = tmp.Marshrut_id
WHERE 1=1


Т.е айди шагать должен от 700. На выходе получаю такую картинку:

Картинка с другого сайта.

"Шагает" с 950, а id и mList_id вообще не обновляет.
12 дек 15, 16:04    [18550873]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Вообще отвлекаясь от темы, я пытаюсь слить две базы в одну. Для этого я и меняю айдишники, чтобы они не пересекались, но я кажется уже начинаю путаться. Может существует более простой способ, про который я не знаю ? Подскажите пожалуйста.
12 дек 15, 20:50    [18551785]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ondayl
Может существует более простой способ, про который я не знаю ?

Способ проще команды UPDATE ?
13 дек 15, 11:14    [18553517]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Glory, ну да, наверное проще ничего нет.
Просто скрипт который дали выше, он так скажем, не универсальный, я его пытаюсь редактировать, что-то обновляется, а что-то и нет. У меня вот такой например скелет запроса:

SELECT SCHED.mList_id, ml.id, MD.mList_id, SM.mList_id
FROM [BN_PATP_DISTR].[dbo].[PATP_Schedule] AS SCHED
INNER JOIN BN_PATP_DISTR..PATP_MarshrutList AS ML
ON SCHED.mList_id = ML.id
INNER JOIN BN_PATP_DISTR..PATP_MarshrutData AS MD
ON MD.mList_id = ML.id
INNER JOIN [BN_PATP_DISTR].[dbo].[PATP_SubMarshrut] AS SM
ON ML.id = SM.mList_id

Но что то ничего не получается. Задача моя назначить одинаковые значения идентификаторов начиная с 2000, напрмер. Ну или просто с N цифры.
13 дек 15, 12:32    [18553630]     Ответить | Цитировать Сообщить модератору
 Re: оменять значения идентификаторов в нескольких таблицах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ondayl
Но что то ничего не получается.

Ну так пробуйте, пока не получится
Так не бывает, что поля+число то работает, то не работает
13 дек 15, 12:47    [18553651]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить