Sybase db テーブルには、行番号を自己更新するという概念がありません。ただし、モジュールの 1 つについては、データベース内の各行に対応する行番号が存在する必要があるため、max(Column) は常にテーブル内の行数を教えてくれます。
int 列を導入し、この列を更新して行番号を追跡しようと考えました。ただし、削除の場合にこの列を更新する際に問題があります。この列を更新するには、削除トリガーでどの SQL を使用する必要がありますか?
ID列を使用すると、各行に一意の番号を簡単に割り当てることができます。IDは、数値または整数(ASE12 +の場合)にすることができます。
これはほとんどあなたが必要とすることをします。IDシーケンスにギャップが生じる特定の状況があります。(これらは「アイデンティティギャップ」と呼ばれ、それらに関する最良の議論はここにあります)。また、削除すると、特定したようにシーケンスにギャップが生じます。
count(*)を使用できるのに、なぜmax(col)を使用してテーブルの行数を取得する必要があるのですか?テーブルから最後の行を取得しようとしている場合は、次のことができます。
select * from table where column = (select max(column) from table).
手動で管理されている列を更新するための削除トリガーに関しては、これがデッドロックの潜在的な原因であり、多くのパフォーマンスの問題があると思います。テーブルに100万行あり、行1を削除するとします。これは、IDから1を引くために更新する必要がある999999行です。
なぜあなたがこれをしたいかわかりません。一時テーブルを使用して実験し、以下のようなID列を使用して「選択」することができます。
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
これにより、(ある種の)動的IDが得られます
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 フィールドを使用します。
このテーブルに削除トリガーを配置すると、ロックの問題が発生する可能性が大幅に減少します。
テーブルの行番号を常に最新の状態に保つ必要がありますか?
そうでない場合は、1 分ごとに実行され、rownum のギャップをチェックして更新を行うジョブを作成できます。
質問: 行番号は、行が挿入された順序を反映する必要がありますか?
そうでない場合は、更新をはるかに少なくして、最新の行のみを更新し、それらをギャップに「移動」することができます。
これらのアイデアの SQL を投稿してほしい場合は、コメントを残してください。