Номер строки в таблицах Sybase - PullRequest
1 голос
/ 08 октября 2008

В таблицах базы данных Sybase отсутствует концепция самообновления номеров строк. Однако для одного из модулей мне требуется наличие номера строки, соответствующей каждой строке в базе данных, чтобы max (Column) всегда сообщал мне количество строк в таблице.

Я подумал, что введу столбец int и буду обновлять этот столбец, чтобы отслеживать номер строки. Однако у меня возникли проблемы с обновлением этого столбца в случае удаления. Какой sql я должен использовать в триггере удаления, чтобы обновить этот столбец?

Ответы [ 3 ]

2 голосов
/ 08 октября 2008

Вы можете легко присвоить уникальный номер каждой строке, используя столбец идентификаторов. Идентификационные данные могут быть числовыми или целыми (в ASE12 +).

Это почти сделает то, что вам нужно. Есть определенные обстоятельства, при которых вы получите пробел в последовательности идентичности. (Они называются «пробелами в идентичности», лучшее обсуждение по ним - здесь ). Также удаление приведет к появлению пробелов в последовательности, которую вы определили.

Зачем вам нужно использовать max (col), чтобы получить количество строк в таблице, когда вы можете просто использовать count (*)? Если вы пытаетесь получить последний ряд из таблицы, тогда вы можете сделать

select * from table where column = (select max(column) from table).

Что касается триггера удаления для обновления столбца, управляемого вручную, я думаю, что это может стать потенциальным источником взаимоблокировок и многих проблем с производительностью. Представьте, что в вашей таблице 1 миллион строк, и вы удалили строку 1, то есть 999999 строк, которые теперь нужно обновить, чтобы вычесть 1 из идентификатора.

0 голосов
/ 09 октября 2008

Удалить триггер

CREATE TRIGGER tigger ON myTable FOR DELETE
AS 
update myTable 
set id = id - (select count(*) from deleted d where d.id < t.id)  
from myTable t

Во избежание проблем с блокировкой

Вы можете добавить дополнительную таблицу (которая присоединяется к вашей основной таблице) следующим образом:

CREATE TABLE rowCounter 
(id    int,      -- foreign key to main table
 rownum int) 

... и используйте поле rownum из этой таблицы.
Если вы поместите триггер удаления в эту таблицу, вы значительно уменьшите вероятность проблем с блокировкой.

Приблизительное решение?

Нужно ли таблице постоянно обновлять свои номера?
Если нет, у вас может быть задание, которое выполняется каждую минуту или около того, которое проверяет наличие пробелов в rownum и выполняет обновление.

Вопрос: должны ли числовые значения отражать порядок, в котором были вставлены строки?
Если нет, вы могли бы сделать гораздо меньше обновлений, но только обновлять самые последние строки, «перемещая» их в пропуски.

Оставьте комментарий, если вы хотите, чтобы я опубликовал любой SQL для этих идей.

0 голосов
/ 08 октября 2008

Я не уверен, почему вы хотели бы сделать это. Вы можете поэкспериментировать с использованием временных таблиц и «выбрать в» со столбцом идентификаторов , как показано ниже.

create table test
 ( 
 col1 int,
 col2 varchar(3)
 )

 insert into test values (100, "abc")
 insert into test values (111, "def")
 insert into test values (222, "ghi")
 insert into test values (300, "jkl")
 insert into test values (400, "mno")

select rank = identity(10), col1 into #t1 from Test
select * from #t1

delete from test where col2="ghi"

select rank = identity(10), col1 into #t2 from Test
select * from #t2

drop table test
drop table #t1
drop table #t2

Это даст вам динамический идентификатор (своего рода)

...