Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Новый вопросЕЦ ... / 17 сообщений из 17, страница 1 из 1
16.09.2002, 14:09:53
    #32050720
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Тут у меня новый вопрос на грани проблемы...

Упрощенно: Есть таблица с двумя полями, одно из которых - Identity и Primary Key, второе - простое...
Надо вставить строку не в конец..., а в середку, в нужное место... (чтобы нумерация по Identity в нижележащих записях увеличилась на единицу и отработалась во всех связанных на Primary Key таблицах)
Как самым простым способом организовать такую вставку?

P.S. Решая ее как в книжках - придется много дописывать в существующих скриптах... - А вот если бы изменить только скрипт вставки...

Всем заранее спасибо...
...
Рейтинг: 0 / 0
16.09.2002, 14:11:38
    #32050721
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Боюсь, что это непросто. Если вообще возможно.
...
Рейтинг: 0 / 0
16.09.2002, 14:12:47
    #32050722
APM
APM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Правильно ли я понял, что вы собираетесь править столбец с атрибутом IDENTY, мне кажется что это не получится.

Придется наверное со столбца identy снять и прописывать все ручками (trigers, процедурами вставки и т.д.)
...
Рейтинг: 0 / 0
16.09.2002, 14:22:32
    #32050725
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Насколько понимаю - то убрать Identity и написать ХП или триггер для инсерта+ свой механизм нумерации
...
Рейтинг: 0 / 0
16.09.2002, 14:25:18
    #32050726
Max_rv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
А зачем геммороится?
Введите доп. поле (назовем 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

Тогда и проблем со связанными таблицами не будет.
...
Рейтинг: 0 / 0
16.09.2002, 14:33:00
    #32050732
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
... Да... Написала, посмотрела что написала... и задумалась, нафига я это писала... В принципе, и сама догадывалась, что легче будет пойти другим путем...

Поэтому вопрос, а что можно изменить в такой таблице, что добавить, чтобы сию затею реализовать побыстрому этим самым другим путем?
...
Рейтинг: 0 / 0
16.09.2002, 14:34:15
    #32050735
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
ИМХО Primary Key менять = искать ранее неизведанные трудности, т.к. каждое такое изменение в мастер-таблице ( Parent ) может привести к нескольким сотням (а то и тысячам) дополнительных операций коррекции внешних ключей ( Foreign Key ) в подчиненных ( Child ) таблицах.

ЗЫ Хотя - был не прав. При такой технике перенумерации - к десяткам тысяч дополнитнльных операций. Нормально, да?
...
Рейтинг: 0 / 0
16.09.2002, 14:39:34
    #32050736
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Допустим, в таблице T 10 записей с ID 1...10. Столбец ID не должен быть с identity. Вам необходимо вставить запись так, чтобы она расположилась между записями с ID=4 и ID=5.
Код: plaintext
1.
update T set ID=ID+ 1  where ID> 4 
insert into T (ID, FName) values ( 5 , "Новая запись" )

Данные действия выполняются в одной транзакции. Если записей в таблице много и одновременно работающих с таблицей пользователей тоже немало, скорее всего у вас возникнут проблемы с блокировками. Это та причина, по которой обычно так стараются не делать. Просто, каждая вставка записи у вас скорее всего будет приводить к длительной блокировке всей таблицы.

Если нужно иметь возможность сортировки записей в определенном порядке, то проще завести дополнительное поле для сортировки (например, типа Float). При этом ID остается с identity. Тогда помещение записи между ID=4 и ID=5 производится таким образом:
insert into T (ID, FName, SortField)
Код: plaintext
select  5 , "Новая запись" , ((select SortField from T where ID= 4 )+(select SortFiald from T where ID= 5 )) /  2 . 0 

То есть, значение сортировочного поля является средним арифметическим между значениями этих полей двух "соседних" записей. Подразумевается, что по умолчанию SortField получает значение ID, преобразованное во Float. А строки таблицы T выбираются с указанием "order by SortField".
...
Рейтинг: 0 / 0
16.09.2002, 14:46:27
    #32050743
Makc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Сорри оговорился:
update MyTable set number=number+1 where number>=@Number
...
Рейтинг: 0 / 0
16.09.2002, 15:13:24
    #32050757
Yossarian
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Я бы сказал, что проблема где-то в другом месте.
Если возникает задача перенумерования первичного ключа
таблицы, значит в дизайне базы есть ошибка.
По смыслу первичный ключ есть уникальный идентификатор
каждой записи. Менять его таким способом бессмысленно.
...
Рейтинг: 0 / 0
16.09.2002, 15:15:15
    #32050758
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Код: plaintext
set identity_insert 
?
...
Рейтинг: 0 / 0
16.09.2002, 15:19:05
    #32050761
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Ната, а что определяет порядок записи? Т.е. какой критерий позволяет прикинуть, что конкретно эту запись надо "вдвинуть" сюда-то?
Ведь исходя из этого критерия номер записи можно вычислять на ходу прямо в запросе и не придумывать себе сложности.
...
Рейтинг: 0 / 0
16.09.2002, 15:31:42
    #32050766
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
На самом деле эта таблица - упрощенный вариант большого справочника, к которому есть порядка ста различных хитроумных запросов...

Я подумала и решила - лучше ввести дополнительное поле сквозной нумерации... но помогите мне написать запрос вставки записи с "пересчитыванием нижележащих записей"...
...
Рейтинг: 0 / 0
16.09.2002, 15:40:08
    #32050767
Makc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
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
...
Рейтинг: 0 / 0
16.09.2002, 15:48:33
    #32050775
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Упрощенно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table Recount 
    (id int identity( 1 , 1 ), orderno int not null default  0 )
go

create trigger I_Recount on recount for Insert
    as
update Recount set orderno = orderno +  1  
    where id <> (select id from Inserted) 
        and orderno >= (select orderno from Inserted)
go

insert Recount (orderno) values ( 1 )
insert Recount (orderno) values ( 2 )
insert Recount (orderno) values ( 3 )
insert Recount (orderno) values ( 4 )
insert Recount (orderno) values ( 5 )
insert Recount (orderno) values ( 3 )
go

select * from Recount order by orderno
go


PS Необходимо написать аналогичные триггеры для удаления и обновления.
...
Рейтинг: 0 / 0
16.09.2002, 18:50:31
    #32050834
Ната
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Прошу прощения за приставучесть, а если без тригеров и ХП, а одним запросом - может с созданием временной таблицы ?...
...
Рейтинг: 0 / 0
17.09.2002, 10:37:26
    #32050884
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новый вопросЕЦ ...
Одним запросом - никак, т.к. необходимо произвести две разнородные операции INSERT & UPDATE. Такое можно сделать с помощью ХП или, если нужно произвести разовую операцию, то скриптом из QA.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Новый вопросЕЦ ... / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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