2009-12-31 2 views
0

Эй, я ищу наиболее эффективный способ поддержания относительного автоматически увеличивающегося значения объекта. Другими словами, у меня есть таблица объектов и таблица дочерних объектов. У дочерних объектов должен быть столбец, который увеличивается по отношению к другим дочерним объектам для одного и того же родителя. (т.е. дочерний объект 3 родительского объекта 4)Поддержание вторичной, относительной идентификационной колонки

например.

Parent Objects: 
ID|name 
1|Object1 
2|Object2 
3|Object3 

Child Objects: 
ID|relativeID|parentObjectID|name 
1|1|1|Some Child Object 
2|1|2|Some Child Object 
3|2|1|Some Child Object 
4|2|2|Some Child Object 
4|3|1|Some Child Object 

Каков наиболее эффективный способ генерации столбца relativeID? Я думаю, что я должен запросить MAX (relativeID) с тем же parentObjectID, а затем сделать вставку, но мне интересно, вызвали бы это проблемы, если бы были параллельные вставки на одном и том же родительском объекте. Есть ли лучший способ приблизиться к этому?

+2

Что вы используете? –

ответ

0

Добавить поле в таблицу родительских объектов, определяющее максимальное количество дочернего поддиректа. Когда вы вставляете, обязательно сделайте это в транзакции, чтобы никто не мог попасть между вашим чтением max sub-id и вашим изменением.

+0

Я думаю, вы вводите в заблуждение «транзакции» с «блокировкой». – 2009-12-31 15:04:27

+0

Не диспетчер ресурсов автоматически блокирует ресурсы, которые были затронуты во время транзакции? Это часть транзакционного поведения (транзакционная блокировка). –

+0

Возможно, это не так. – 2009-12-31 15:32:55

0

Вы пропустили сообщение о базе данных, которую используете.

Что вы могли бы попытаться это получить относительный идентификатор MAX за родительский объект и использовать его в сделки

Это даст вам MAX идентификатор каждого родительского объекта

DECLARE @Table TABLE(
     ID INT, 
     ID_RELATIVE INT, 
     PARENT_OBJECT_ID INT 
) 

INSERT INTO @Table SELECT 1,1, 1 
INSERT INTO @Table SELECT 2,1, 2 
INSERT INTO @Table SELECT 3,2, 1 
INSERT INTO @Table SELECT 4,2, 2 
INSERT INTO @Table SELECT 4,3, 1 

SELECT MAX(ID_RELATIVE) LAST_ID_RELATIVE, 
     PARENT_OBJECT_ID 
FROM @Table 
GROUP BY PARENT_OBJECT_ID 

Теперь вы можете ограничить это, используя идентификатор родительского объекта, и получить только MAX id для данного родительского объекта. Затем вы можете просто добавить 1 к этому MAX найдено и использовать это как новый autonumber.

Пожалуйста, дайте мне знать, если вам требуется дополнительная помощь, или если это не работает в вашей конкретной БД.

Смежные вопросы