7

I have a table that is exposed to large inserts and deletes on a regular basis (and because of this there are large gaps in the number sequence of the primary id column). It had a primary id column of type 'int' that was changed to 'bigint'. Despite this change, the limit of this datatype will also inevitably be exceeded at some point in the future (current usage would indicate this to be the case within the next year or so).

How do you handle this scenario? I'm wondering (shock horror) whether I even need the primary key column as it's not used in any obvious way in any queries or referenced by other tables etc. Would removing the column be a solution? Or would that sort of action see you expelled from the mysql community in disgust?!

We're already nearly at the 500 million mark for the auto increment id. The table holds keywords associated with file data in a separate table. Each file data row could have as many as 30 keywords associated with it in the keywords table, so they really start to stack up after you've got tens of thousands of files constantly being inserted and deleted. Currently the keyword table contains the keyword and the id of the file it's associated with, so if I got rid of the current primary id column, there would be no unique identifier other than the keyword (varchar) and file id (int) fields combined, which would be a terrible primary key.

All thoughts/answers/experiences/solutions very gratefully received.

4

4 に答える 4

28

1年前にすでに回答されていることは知っていますが、Luc Frankenの回答を続けるために、

1 秒あたり 5 億行を挿入すると、BIG INT の限界に達するまでに約 1173 年かかります。ええ、私はそれについて心配しないと思います

于 2013-06-05T09:47:24.617 に答える
10

一意のレコードの別の識別子があるため、その列が必要ない場合。提供された Measurement_id など、または結合されたキーのように、measurement_id + location_id のように、自動インクリメント キーを使用する必要はありません。一意のキーを持たない可能性がある場合は、確実にキーを作成してください。

非常に大きな自動インクリメント ID が必要な場合はどうすればよいですか?

挿入と削除の回数が多すぎて限界に達すると本当に確信していますか?

于 2012-07-21T10:08:40.930 に答える
0

少し遅すぎるかもしれませんが、DELETE でトリガーを追加できます。

ここにSQL SERVERのサンプルコードがあります

CREATE TRIGGER resetidentity
    ON dbo.[table_name]
    FOR DELETE
AS
    DECLARE @MaxID INT
    SELECT @MaxID = ISNULL(MAX(ID),0)
    FROM dbo.[table_name]
    DBCC CHECKIDENT('table_name', RESEED, @MaxID)
GO

簡単に言えば、これによりIDがリセットされます(自動インクリメントとプライマリの場合)。例: 800 行あり、最後の 400 行を削除した場合、次に挿入すると、801 ではなく 401 から開始されます。

しかし、欠点は、中間レコードで ID を削除しても ID が再配置されないことです。EX が 800 行あり、ID 200-400 を削除した場合、次に新しい行を書き込むときに ID は 801 でカウントされます。

于 2017-03-06T01:50:16.130 に答える