|
|
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Тут у меня новый вопрос на грани проблемы... Упрощенно: Есть таблица с двумя полями, одно из которых - Identity и Primary Key, второе - простое... Надо вставить строку не в конец..., а в середку, в нужное место... (чтобы нумерация по Identity в нижележащих записях увеличилась на единицу и отработалась во всех связанных на Primary Key таблицах) Как самым простым способом организовать такую вставку? P.S. Решая ее как в книжках - придется много дописывать в существующих скриптах... - А вот если бы изменить только скрипт вставки... Всем заранее спасибо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 14:09:53 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Боюсь, что это непросто. Если вообще возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 14:11:38 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Правильно ли я понял, что вы собираетесь править столбец с атрибутом IDENTY, мне кажется что это не получится. Придется наверное со столбца identy снять и прописывать все ручками (trigers, процедурами вставки и т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 14:12:47 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Насколько понимаю - то убрать Identity и написать ХП или триггер для инсерта+ свой механизм нумерации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 14:22:32 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
А зачем геммороится? Введите доп. поле (назовем Number) и вставку записей выполняйте через хп, что-то вроде: sp_AddRecord(@Number bigint, @Text nvarchar(255)) begin trans if exists(select number from MyTable) begin update MyTable set number=number+1 end insert into MyTable(Number, Text) values (@Number, @Text) commit trans Тогда и проблем со связанными таблицами не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 14:25:18 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
... Да... Написала, посмотрела что написала... и задумалась, нафига я это писала... В принципе, и сама догадывалась, что легче будет пойти другим путем... Поэтому вопрос, а что можно изменить в такой таблице, что добавить, чтобы сию затею реализовать побыстрому этим самым другим путем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 14:33:00 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
ИМХО Primary Key менять = искать ранее неизведанные трудности, т.к. каждое такое изменение в мастер-таблице ( Parent ) может привести к нескольким сотням (а то и тысячам) дополнительных операций коррекции внешних ключей ( Foreign Key ) в подчиненных ( Child ) таблицах. ЗЫ Хотя - был не прав. При такой технике перенумерации - к десяткам тысяч дополнитнльных операций. Нормально, да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 14:34:15 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Допустим, в таблице T 10 записей с ID 1...10. Столбец ID не должен быть с identity. Вам необходимо вставить запись так, чтобы она расположилась между записями с ID=4 и ID=5. Код: plaintext 1. Данные действия выполняются в одной транзакции. Если записей в таблице много и одновременно работающих с таблицей пользователей тоже немало, скорее всего у вас возникнут проблемы с блокировками. Это та причина, по которой обычно так стараются не делать. Просто, каждая вставка записи у вас скорее всего будет приводить к длительной блокировке всей таблицы. Если нужно иметь возможность сортировки записей в определенном порядке, то проще завести дополнительное поле для сортировки (например, типа Float). При этом ID остается с identity. Тогда помещение записи между ID=4 и ID=5 производится таким образом: insert into T (ID, FName, SortField) Код: plaintext То есть, значение сортировочного поля является средним арифметическим между значениями этих полей двух "соседних" записей. Подразумевается, что по умолчанию SortField получает значение ID, преобразованное во Float. А строки таблицы T выбираются с указанием "order by SortField". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 14:39:34 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Сорри оговорился: update MyTable set number=number+1 where number>=@Number ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 14:46:27 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Я бы сказал, что проблема где-то в другом месте. Если возникает задача перенумерования первичного ключа таблицы, значит в дизайне базы есть ошибка. По смыслу первичный ключ есть уникальный идентификатор каждой записи. Менять его таким способом бессмысленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 15:13:24 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 15:15:15 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Ната, а что определяет порядок записи? Т.е. какой критерий позволяет прикинуть, что конкретно эту запись надо "вдвинуть" сюда-то? Ведь исходя из этого критерия номер записи можно вычислять на ходу прямо в запросе и не придумывать себе сложности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 15:19:05 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
На самом деле эта таблица - упрощенный вариант большого справочника, к которому есть порядка ста различных хитроумных запросов... Я подумала и решила - лучше ввести дополнительное поле сквозной нумерации... но помогите мне написать запрос вставки записи с "пересчитыванием нижележащих записей"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 15:31:42 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
sp_AddRecord(@Number bigint, @Text nvarchar(255)) begin trans if exists(select number from MyTable) begin update MyTable set number=number+1 where number>=@number end insert into MyTable(Number, Text) values (@Number, @Text) commit trans ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 15:40:08 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Упрощенно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. PS Необходимо написать аналогичные триггеры для удаления и обновления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 15:48:33 |
|
||
|
Новый вопросЕЦ ...
|
|||
|---|---|---|---|
|
#18+
Прошу прощения за приставучесть, а если без тригеров и ХП, а одним запросом - может с созданием временной таблицы ?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2002, 18:50:31 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32050720&tid=1820307]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
59ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 388ms |

| 0 / 0 |
