Таблицы Sybase db не поддерживают самообновление номеров строк. Однако для одного из модулей мне требуется наличие номера строки, соответствующего каждой строке в базе данных, чтобы max (столбец) всегда сообщал мне количество строк в таблице.
Я подумал, что введу столбец int и продолжу обновлять этот столбец, чтобы отслеживать номер строки. Однако у меня возникают проблемы с обновлением этого столбца в случае удалений. Какой sql следует использовать в триггере удаления для обновления этого столбца?


Вы можете легко присвоить уникальный номер каждой строке с помощью столбца идентификаторов. Идентификационные данные могут быть числовыми или целыми (в ASE12 +).
почти сделает то, что вам нужно. Есть определенные обстоятельства, при которых вы получите пробел в идентификационной последовательности. (Это называется «пробелы в идентичности», лучше всего их обсуждать здесь). Кроме того, удаления вызовут пропуски в последовательности, как вы определили.
Зачем вам нужно использовать max (col), чтобы получить количество строк в таблице, если вы можете просто использовать count (*)? Если вы пытаетесь получить последнюю строку из таблицы, вы можете сделать
select * from table where column = (select max(column) from table).
Что касается триггера удаления для обновления столбца, управляемого вручную, я думаю, что это может быть потенциальным источником взаимоблокировок и многих проблем с производительностью. Представьте, что у вас есть 1 миллион строк в вашей таблице, и вы удаляете строку 1, это 999999 строк, которые вам теперь нужно обновить, чтобы вычесть 1 из идентификатора.
Я действительно не понимаю, как это помогает спрашивающему?
Я не уверен, зачем вам это нужно. Вы можете поэкспериментировать с использованием временных таблиц и "выбрать в" с помощью столбца "Идентификация", как показано ниже.
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
Это даст вам динамический идентификатор (своего рода)
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 для этих идей.
Можете ли вы уточнить, почему вам нужен max (столбец), чтобы дать вам количество строк в таблице? благодаря.