各行の「シーケンス」列に独自のシーケンス番号がある mysql テーブルがあります。ただし、行が削除されると、ギャップが残ります。そう...
1
2
3
4
...なる...
1
2
4
シーケンスを「リセット」して、1 つの SQL クエリで再び連続するようにする適切な方法はありますか?
ちなみに、この工程には専門用語があると思います。誰?
更新: 「シーケンス」列は主キーではありません。アプリ内でレコードが表示される順序を決定するためにのみ使用されます。
各行の「シーケンス」列に独自のシーケンス番号がある mysql テーブルがあります。ただし、行が削除されると、ギャップが残ります。そう...
1
2
3
4
...なる...
1
2
4
シーケンスを「リセット」して、1 つの SQL クエリで再び連続するようにする適切な方法はありますか?
ちなみに、この工程には専門用語があると思います。誰?
更新: 「シーケンス」列は主キーではありません。アプリ内でレコードが表示される順序を決定するためにのみ使用されます。
...では、この質問の他の場所で述べたように、ID を変更するべきではありません。ID はすでに一意であり、それらを再利用する必要も、再利用する必要もありません。
さて、それは言った...
アプリケーション定義の順序付けのために、別のフィールド (つまり、PK と同様) を使用する可能性は十分にあります。この順序付けが他のフィールドに固有でない限り (たとえば、ユーザー定義の場合)、これに問題はありません。
auto_increment
(一時的な)フィールドを使用してテーブルを再作成し、auto_increment
後で削除することができます。
UPDATE
昇順で増分変数を適用したくなるでしょう。
SET @i = 0;
UPDATE `table`
SET `myOrderCol` = @i:=@i+1
ORDER BY `myOrderCol` ASC;
(クエリはテストされていません。)
アイテムを削除するたびにこれを行うのは非常に無駄に思えますが、残念ながら、この手動の順序付けアプローチでは、列の整合性を維持したい場合にできることはあまりありません。
次のようなエントリを削除した後、次のように、負荷を軽減できる可能性がありmyOrderCol
ます5
。
SET @i = 5;
UPDATE `table`
SET `myOrderCol` = @i:=@i+1
WHERE `myOrderCol` > 5
ORDER BY `myOrderCol` ASC;
(クエリはテストされていません。)
これにより、次のすべての値が 1 つずつ「シャッフル」されます。
気にしないでください。連続した値の再割り当ては比較的高価な操作であり、列の値が順序付けのみを目的としている場合、それを行う正当な理由はありません。たとえば、列が UNSIGNED INT であり、アプリケーションの存続期間中に 4,294,967,296 行 (削除された行を含む) を超えて範囲外になる可能性があると思われる場合、それが懸念事項であっても、唯一の懸念事項は次のとおりです。 10 年後に再割り当てを 1 回限りのタスクとして実行できます。
これは私がここや他のフォーラムでよく読む質問です。すでにzerkmsによって書かれているように、これは誤った問題です。さらに、あなたのテーブルが他のテーブルと関連している場合、あなたは関係を失います。
学習目的のためだけに、簡単な方法は、データを一時テーブルに格納し、元のテーブルを切り捨てて(このリセットauto_increment)、それを再入力することです。
愚かな例:
create table seq (
id int not null auto_increment primary key,
col char(1)
) engine = myisam;
insert into seq (col) values ('a'),('b'),('c'),('d');
delete from seq where id = 3;
create temporary table tmp select col from seq order by id;
truncate seq;
insert into seq (col) select * from tmp;
しかし、それはまったく役に立たない。;)
これがPKである場合は、変更しないでください。PKは(ほとんど)不変の列である必要があります。それらを変更する場合は、そのテーブルだけでなく、存在する外部キーでも変更する必要があります。
シーケンシャルシーケンスが必要な場合は、その理由を自問してください。テーブルには、固有の順序または保証された順序はありません(PKでも、ほとんどのRDBMSがデータを格納および取得する方法が原因で、そのようになる可能性があります)。ORDER BY
これが、SQLに句がある理由です。他の何か(データベースに追加された時間など)に基づいて連番を生成できるようにしたい場合は、クエリまたはフロントエンドのいずれかで連番を生成することを検討してください。
これが ID フィールドであると仮定すると、次の挿入時にこれを行うことができます。
INSERT INTO yourTable (ID)
SELECT MIN(ID)
FROM yourTable
WHERE ID > 1
他の人が言ったように、私はこれを行うことをお勧めしません。次の ID が評価される間、テーブル ロックが保持されます。