powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сдвиг в таблице по уникальному индексу
20 сообщений из 20, страница 1 из 1
Сдвиг в таблице по уникальному индексу
    #32508786
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица (Table1) с одним полем (Num) , уникальным
Значения - 1, 2, 3, ..., 10
Как, начиная с, скажем, "3", сдвинуть все на 1 вверх, чтоб вышло:
1, 2, 4, 5, 6, 7, 8, 9, 10, 11

update Table1 set Num=Num+1
where Num>=3
- фиг там: "Ошибка первичного ключа"

Есть несколько способов:

1) FOR

FOR select Num from Table1
where Num >= 3
order by 1 Desc
INTO :Rec
DO
update
Table1 set Num=Num+1
where (Num=:Rec);

2) убить уникальный индекс , выполнить апдейт, а потом создать индекс заново

3) update за область существующих номеров и потом назад со сдвигом на 1:

select max (Num) from Table1 into Rec;
update Table1 set Num=Num+Rec where Num>=3;
update Table1 set Num=Num-Rec+1 where Num>=Rec;

4) использование доп. поля в уникальном ключе

Я сейчас морочусь через "FOR SELECT... DO..." (просто это первое, что пришло в голову, и для моего кол-ва записей не тормозит)
А можно как-то попроще? Как-нибудь извернуться update`ом все-таки?

И что будет производительней?
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32508823
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не морокайся. Вариант с FOR SELECT весьма быстр и безопасен.
Ещё больше его можно ускорить, используя курсор:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
FOR select Num from Table1
     where Num >=  3 
     order by  1  Desc
  INTO :Rec
  AS CURSOR TMP_CURSOR
DO
  update Table1 set Num=Num+ 1 
  where CURRENT OF TMP_CURSOR;
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32509231
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Scream

А в чём сокральный смысл данного действа ?

...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32509272
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/topic/39836&hl=
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32509882
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Johnmen>Scream

А в чём сокральный смысл данного действа ?

Смысл в том, чтобы сдвинуть данные, не вызвав " violation of PRIMARY or UNIQUE KEY... ". А в освобожденное место чего-нибудь вставить.
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32509892
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedd/topic/39836&hl=
Спасибо, довольно познавательно.
Похоже, вопрос оказался не таким глупым, как мне казалось сначала...

Там в обсуждении промелькнула такая идея:

Ex_SoftДаже есть модификаторы
Грабер писал:
...DEFERRABLE - (отстроченные, т.е. выполняемые с отстрочкой) или NOT DEFERRABLE (срочные, т.е. выполняемые сразу. Если определение отсутствует, то по умолчанию используется значение NOT DEFERRABLE...

Она продолжение имела? Можно где-то скрипт с этим самым DEFERRABLE увидеть? И какие SQL-сервера поддерживают его?
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32510215
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Scream

Так в чем же всё-таки сокральный смысл "сдвига данных" ???????

>А в освобожденное место чего-нибудь вставить.

Что за место ?
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32510269
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnmenЧто за место ?
Свято место пусто не бывает

_________________
"Hello, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32510526
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Johnmen
Сокральный смысл в здвиге, вероятнее всего связан с номером по порядку..
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32510598
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М-даа, оффтопика развелось... После fedd ничего полезного сказано не было :(

Мимопроходящий, спасибо за курсор! На 150 000 записях стало ощутимо быстрее.

Johnmen, не могу понять, чего же ты все-таки не можешь понять? :) Может, ты знаешь что-то, чего не знаю я? Касательно этого вопроса, я имею ввиду?
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32510614
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про DEFERRABLE, видимо, никто не знает - поспрашивайте на форуме Oracle, DB2 и MSSQL, есть ли у них.

по теме сдвига - "оффтопик" объясняется тем, что все считают, что сдвигать не должно быть нужно, и поэтому пытаются узнать, зачем это оказалось нужно вам.

кажется, в том топике мы договорились до того, что ни суррогатный ключ, ни уникальные номера бумажных документов менять не нужно...
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32510638
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачи разные бывают. К примеру, мне пришлось некогда разрабатывать билетно-кассовую систему для культурно-массово-зрелищных учереждений.
Естественно, что система должна была быть гибкой и обладать возможностью адаптации к любым залам и любой "раскладке" мест и зрительных рядов.
Соответственно пришлось реализовать функции "Сдвинуть ряд влево", "Сдвинуть вправо" и т.п.
Но конечно же, сдвиги не по PRIMARY KEY .
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32510720
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, я сдвигаю не по PRIMARY KEY, а по уникальному индексу.

fedd, я пишу менеджер для интеллектуальных весов DIGI разных моделей. Там в них надо закачать кучу разных файлов настройки - товары, этикетки, сопутствующие сообщения... и в том числе раскладку клавиатуры. И на одну клавишу можно назначить несколько разнвых товаров - типа продавец нажимает на эту клавишу, а на дисплее высвечиваются товары в определенной последовательности. Вот эту последовательность и надо запрограммировать с помощью таблицы такого типа, как я привел.

Короче - сдвигать-таки надо...
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32511853
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ыменно, вот ыменно...

>Мимопроходящий
>Но конечно же, сдвиги не по PRIMARY KEY.

Прошу обратить пристальное внимание автора...


И ещё... Может я глуп, но я не понял ЖИТЕЙСКОГО смысла "сдвига"...
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32512632
Vagon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
**
Правильный ответ - убитие индекса: в среднем, Вы меняете половину записей в таблице, => и 50% индекса. В описании ALTER INDEX ACTIVE/INACTIVE разработчики советуют убивать индекс при вставке/удалении 15% записей либо изменении 10%.

**
А вообще, по-моему, Вы совершенно зря сделали индекс уникальным - на ссылочную целостность БД этот ограничитель в Вашем индексе совершенно не влияет (как мне видно отсюда :).
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32512722
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VagonПравильный ответ - убитие индекса: в среднем, Вы меняете половину записей в таблице, => и 50% индекса.

:( В том-то все и дело, что в моем случае я меняю не более 1% записей в таблице...

VagonВ описании ALTER INDEX ACTIVE/INACTIVE разработчики советуют убивать индекс при вставке/удалении 15% записей либо изменении 10%.
Хммм..... Спасибо за информацию. Есть смысл переделать другие триггера в моей базе ;)

VagonА вообще, по-моему, Вы совершенно зря сделали индекс уникальным - на ссылочную целостность БД этот ограничитель в Вашем индексе совершенно не влияет (как мне видно отсюда :).

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

--
LET`S ROCK!
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32513411
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, фиг с ним, с этим сдвигом - есть уже 4 способа, какой-то лучше, какой-то хуже, но все работают.

А вот как в такой таблице поменять местами две записи? То есть - было "1, 2, 3, 4, 5", а стало - "5, 2, 3, 4, 1"?

--
LET`S ROCK!
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32513426
а
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а
Гость
> Есть таблица (Table1) с одним полем (Num), уникальным

> А вот как в такой таблице поменять местами две записи? То есть - было "1, 2, 3, 4, 5", а стало - "5, 2, 3, 4, 1"?

если поле только одно, можешь считать, что записи местами уже поменяны!
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32513502
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 a:

))))) Веселый ответ
А если не одно? Если там составной индекс и куча полей, по которым к таблице привязаны другие таблицы?

Кстати, даже если поле одно - напишите скрипт, который в триггере before update менял бы местами две записи?

--
LET`S ROCK!
...
Рейтинг: 0 / 0
Сдвиг в таблице по уникальному индексу
    #32515205
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может хватит веселить народ, и перейти к чтению литературы по концепции, проектированию и функционированию реляционных баз данных ?

...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сдвиг в таблице по уникальному индексу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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