|
|
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
Есть таблица (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`ом все-таки? И что будет производительней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 12:03 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
Не морокайся. Вариант с FOR SELECT весьма быстр и безопасен. Ещё больше его можно ускорить, используя курсор: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 12:15 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 14:47 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
/topic/39836&hl= ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 15:02 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
Johnmen>Scream А в чём сокральный смысл данного действа ? Смысл в том, чтобы сдвинуть данные, не вызвав " violation of PRIMARY or UNIQUE KEY... ". А в освобожденное место чего-нибудь вставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 21:36 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
fedd/topic/39836&hl= Спасибо, довольно познавательно. Похоже, вопрос оказался не таким глупым, как мне казалось сначала... Там в обсуждении промелькнула такая идея: Ex_SoftДаже есть модификаторы Грабер писал: ...DEFERRABLE - (отстроченные, т.е. выполняемые с отстрочкой) или NOT DEFERRABLE (срочные, т.е. выполняемые сразу. Если определение отсутствует, то по умолчанию используется значение NOT DEFERRABLE... Она продолжение имела? Можно где-то скрипт с этим самым DEFERRABLE увидеть? И какие SQL-сервера поддерживают его? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 21:56 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
>Scream Так в чем же всё-таки сокральный смысл "сдвига данных" ??????? >А в освобожденное место чего-нибудь вставить. Что за место ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 10:43 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
JohnmenЧто за место ? Свято место пусто не бывает _________________ "Hello, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 11:00 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
>Johnmen Сокральный смысл в здвиге, вероятнее всего связан с номером по порядку.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 12:39 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
М-даа, оффтопика развелось... После fedd ничего полезного сказано не было :( Мимопроходящий, спасибо за курсор! На 150 000 записях стало ощутимо быстрее. Johnmen, не могу понять, чего же ты все-таки не можешь понять? :) Может, ты знаешь что-то, чего не знаю я? Касательно этого вопроса, я имею ввиду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 13:12 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
про DEFERRABLE, видимо, никто не знает - поспрашивайте на форуме Oracle, DB2 и MSSQL, есть ли у них. по теме сдвига - "оффтопик" объясняется тем, что все считают, что сдвигать не должно быть нужно, и поэтому пытаются узнать, зачем это оказалось нужно вам. кажется, в том топике мы договорились до того, что ни суррогатный ключ, ни уникальные номера бумажных документов менять не нужно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 13:20 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
Задачи разные бывают. К примеру, мне пришлось некогда разрабатывать билетно-кассовую систему для культурно-массово-зрелищных учереждений. Естественно, что система должна была быть гибкой и обладать возможностью адаптации к любым залам и любой "раскладке" мест и зрительных рядов. Соответственно пришлось реализовать функции "Сдвинуть ряд влево", "Сдвинуть вправо" и т.п. Но конечно же, сдвиги не по PRIMARY KEY . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 13:30 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий, я сдвигаю не по PRIMARY KEY, а по уникальному индексу. fedd, я пишу менеджер для интеллектуальных весов DIGI разных моделей. Там в них надо закачать кучу разных файлов настройки - товары, этикетки, сопутствующие сообщения... и в том числе раскладку клавиатуры. И на одну клавишу можно назначить несколько разнвых товаров - типа продавец нажимает на эту клавишу, а на дисплее высвечиваются товары в определенной последовательности. Вот эту последовательность и надо запрограммировать с помощью таблицы такого типа, как я привел. Короче - сдвигать-таки надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 14:12 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
Вот ыменно, вот ыменно... >Мимопроходящий >Но конечно же, сдвиги не по PRIMARY KEY. Прошу обратить пристальное внимание автора... И ещё... Может я глуп, но я не понял ЖИТЕЙСКОГО смысла "сдвига"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2004, 01:59 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
** Правильный ответ - убитие индекса: в среднем, Вы меняете половину записей в таблице, => и 50% индекса. В описании ALTER INDEX ACTIVE/INACTIVE разработчики советуют убивать индекс при вставке/удалении 15% записей либо изменении 10%. ** А вообще, по-моему, Вы совершенно зря сделали индекс уникальным - на ссылочную целостность БД этот ограничитель в Вашем индексе совершенно не влияет (как мне видно отсюда :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2004, 10:05 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
VagonПравильный ответ - убитие индекса: в среднем, Вы меняете половину записей в таблице, => и 50% индекса. :( В том-то все и дело, что в моем случае я меняю не более 1% записей в таблице... VagonВ описании ALTER INDEX ACTIVE/INACTIVE разработчики советуют убивать индекс при вставке/удалении 15% записей либо изменении 10%. Хммм..... Спасибо за информацию. Есть смысл переделать другие триггера в моей базе ;) VagonА вообще, по-моему, Вы совершенно зря сделали индекс уникальным - на ссылочную целостность БД этот ограничитель в Вашем индексе совершенно не влияет (как мне видно отсюда :). Так-то оно так... Но хотелось бы, чтобы база сама следила за уникальностью номеров в данном случае. И до сих пор хочется. Хотя я все равно после того, как столкнулся с такой проблемой, два раза менял идеологию данного куска базы... -- LET`S ROCK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2004, 10:56 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
Ладно, фиг с ним, с этим сдвигом - есть уже 4 способа, какой-то лучше, какой-то хуже, но все работают. А вот как в такой таблице поменять местами две записи? То есть - было "1, 2, 3, 4, 5", а стало - "5, 2, 3, 4, 1"? -- LET`S ROCK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2004, 16:18 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
> Есть таблица (Table1) с одним полем (Num), уникальным > А вот как в такой таблице поменять местами две записи? То есть - было "1, 2, 3, 4, 5", а стало - "5, 2, 3, 4, 1"? если поле только одно, можешь считать, что записи местами уже поменяны! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2004, 16:23 |
|
||
|
Сдвиг в таблице по уникальному индексу
|
|||
|---|---|---|---|
|
#18+
2 a: ))))) Веселый ответ А если не одно? Если там составной индекс и куча полей, по которым к таблице привязаны другие таблицы? Кстати, даже если поле одно - напишите скрипт, который в триггере before update менял бы местами две записи? -- LET`S ROCK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2004, 16:49 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32513411&tid=1578670]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
181ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 486ms |

| 0 / 0 |
