Номер строки в таблицах Sybase

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

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

Можете ли вы уточнить, почему вам нужен max (столбец), чтобы дать вам количество строк в таблице? благодаря.

AJ. 09.10.2008 16:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
16 834
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

почти сделает то, что вам нужно. Есть определенные обстоятельства, при которых вы получите пробел в идентификационной последовательности. (Это называется «пробелы в идентичности», лучше всего их обсуждать здесь). Кроме того, удаления вызовут пропуски в последовательности, как вы определили.

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

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

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

Я действительно не понимаю, как это помогает спрашивающему?

AJ. 09.10.2008 16:00

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

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 для этих идей.

Другие вопросы по теме