|
|
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
ASE 15 В таблице есть поле типа numeric в нём номера записей (не identity), просто по порядку 1,2,3,...,N по этому полю создан уникальный индекс Есть потребность перенумеровать часть таблицы начиная с определённой записи на +1 Вопрос: Можно ли это сделать простым запросом или придётся писать процедуру, которая будет перенумеровывать сверху вниз, чтобы индекс не ругался на duplicate key? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2009, 14:35 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
Update Table Set ID = ID + 1 where ID between MinID and MaxID при этом если у вас нет записи с идентификатором ID = MaxID + 1 то все сработает без проблем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2009, 16:30 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
создаем тестовые данные: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: plaintext Код: plaintext 1. Пробуем два: Код: plaintext Код: plaintext проверяем: Код: plaintext Долго думаем.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2009, 17:36 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
/me думает: в далекие-далекие времена... _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2009, 20:39 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
Запросы типа: Код: plaintext 1. 2. 3. Код: plaintext Attempt to insert duplicate key row in object ... Возможно на 5 записях и работают, но у меня тут большая таблица, особые настройки сервера, множество других индексов. В Update же нельзя сказать order by ... desc Сделал такой скрипт: Код: plaintext 1. 2. 3. 4. 5. 6. Мне просто интересно, можно ли это же сделать одним красивым запросом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 08:34 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
У меня уникальный индекс вовсе не "primary key" и даже не кластерный. Это один из индексов, к тому же сразу по трём полям, одно из которых то самое что надо изменить. Поля типа identity в этой таблице вообще нет, как и кластерного индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 08:59 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
User233 У меня уникальный индекс вовсе не "primary key"... Вообще-то подразумевался алгоритм: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 09:41 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
User233Запросы типа: Код: plaintext 1. 2. 3. Код: plaintext Attempt to insert duplicate key row in object ... Хм... Вроде русским по черному написано было: "при этом если у вас нет записи с идентификатором ID = MaxID + 1 то все сработает без проблем" Как изначально Вами предполагается разруливание этой ситуации? Если вы хотите апдейтить записи с ИД 1,2,3,4 а в таблице уже есть запись с ИД = 5? Старый идентификатор 4 должен превратиться в 5, что само собой потянет за собой "Attempt to insert duplicate key row in object ..." Что должно стать со старой записью, у которой ИД = 5? Если же вы апдейтите последовательность идентификаторов N,N+1,...., N+K и в таблице нет идентификатора N+K+1 то все сработает без проблем. declare @ID numeric(10) select @ID = max(ID) from Table while @ID > 4000 begin update Table set ID = ID + 1 where ID = @ID select @ID = max(ID) from Table where ID < @ID end Извините, но этот запрос у вас отработает только в случае, если изначально есть в таблице ID > 4000... В противном случае у вас просто ни разу в условие не зайдет... Во вторых, он обновляет только те записи, которые имеют идентификатор более 4000... Но на асе с этим успешно справляется запрос Update Table set ID = ID + 1 where ID > 4000 и не выдает никаких эксепшенов при этом по крайней мере на 'Adaptive Server Enterprise/15.0.2/EBF 14332/P/NT (IX86)/Windows 2000/ase1502/2486/32-bit/OPT/Thu May 24 04:10:36 2007' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 11:19 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
Mikle83Хм... Вроде русским по черному написано было: "при этом если у вас нет записи с идентификатором ID = MaxID + 1 то все сработает без проблем" Не поверите, нет записей с ID = MaxID + 1 Mikle83Как изначально Вами предполагается разруливание этой ситуации? Если вы хотите апдейтить записи с ИД 1,2,3,4 а в таблице уже есть запись с ИД = 5? Старый идентификатор 4 должен превратиться в 5, что само собой потянет за собой "Attempt to insert duplicate key row in object ..." Что должно стать со старой записью, у которой ИД = 5? С ИД = 5 записей нет, нужно проапдейтить начиная с ИД = 2 и до конца, т.е. до ИД = 4 должно получиться 1,2,4,5 Mikle83Если же вы апдейтите последовательность идентификаторов N,N+1,...., N+K и в таблице нет идентификатора N+K+1 то все сработает без проблем. Я апдейчу с определённого ИД и до конца Mikle83 declare @ID numeric(10) select @ID = max(ID) from Table while @ID > 4000 begin update Table set ID = ID + 1 where ID = @ID select @ID = max(ID) from Table where ID < @ID end Извините, но этот запрос у вас отработает только в случае, если изначально есть в таблице ID > 4000... В противном случае у вас просто ни разу в условие не зайдет... Во вторых, он обновляет только те записи, которые имеют идентификатор более 4000... Но на асе с этим успешно справляется запрос Update Table set ID = ID + 1 where ID > 4000 и не выдает никаких эксепшенов при этом по крайней мере на 'Adaptive Server Enterprise/15.0.2/EBF 14332/P/NT (IX86)/Windows 2000/ase1502/2486/32-bit/OPT/Thu May 24 04:10:36 2007' Конечно у меня в таблице есть ID > 4000. Я же писал в первом сообщении "Есть потребность перенумеровать часть таблицы начиная с определённой записи на +1" Запрос подобный вашему простому апдейту не справляется, выдаёт "Attempt to insert duplicate key..." У вас работает возможно из-за наличия индекса primary key, а у меня этот уникальный индекс далеко не первый и не единственный на таблице (уникальный только один), и нет ни кластерного ни идентити и сервер выбирает записи для апдейта в любом удобном ему порядке. Допустим мне надо перенумеровать 500 записей из 1000, от 500 и до конца, до 1000, чтобы из 1,2,...,500,501,502,...,1000, получилось 1,2,...,500,502,503,...,1001 Вашим запросом сервер начинает апдейтить как ему вздумается, допустим по возрастанию: 501 = 501 + 1 что уже приводит к конфликту, т.к. запись 502 уже была. Надо чтобы он пошел апдейтить так: 1000 = 1000 + 1 999 = 999 + 1 ... Именно это делает мой скрипт, только по одной записи за раз. Мне было просто интересно, из чистого любопытства, можно ли эту операцию проделать одиночным запросом без ошибок duplicate key. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 12:43 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
[quote user233 сервер начинает апдейтить как ему вздумается, допустим по возрастанию: 501 = 501 + 1 что уже приводит к конфликту, т.к. запись 502 уже была. [/quote] /me думает: таки дежавю... Так Вас чем не устраивает? _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 12:58 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
Ex_Soft user233 сервер начинает апдейтить как ему вздумается, допустим по возрастанию: 501 = 501 + 1 что уже приводит к конфликту, т.к. запись 502 уже была. /me думает: таки дежавю... Так Вас чем не устраивает? Нормально, работает. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 13:58 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
Можно сделать так: Drop index ... Update ... set ID = Create index ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 06:17 |
|
||
|
Детский вопрос: перенумерация уникального поля
|
|||
|---|---|---|---|
|
#18+
golsaМожно сделать так: Drop index ... Update ... set ID = Create index ... Долго ждать, однако. Пока этот индекс создастся... на большой таблице и рабочей базе, к тому же кому-то этот индекс нужен, т.к. пользователи работают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 07:14 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=36091830&tid=2010976]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
163ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 15ms |
| total: | 282ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...