我有一个程序,客户触发计算,用计算数据填充表格,以便在会话中进一步使用。但是,我们必须在每次登录时都删除所有记录,然后使用insert into .. select
再次填写表格。
我知道更新行更好,但是有很多东西可以在一段时间后改变/变得过时,所以我们决定删除并重新插入。
这很好用,但我担心在某个时间点我们会达到自动生成的RowId整数的极限。
有没有一种很好的方法来重用已被删除的旧RowId?还是有另一种方法可以确保我们永远不会遇到麻烦吗?
感谢您和我一起思考!
答案 0 :(得分:0)
如果您的意思是身份字段,那么在每个数据库中都有一种方法可以将数字重置为您想要的任何数字。只需谷歌你的数据库并重置身份以获得正确的语法。
最好的方法是编写一个小脚本,有时可以运行以更改从1开始的所有现有ID,然后将identity设置为max + 1.
例如:如果您当前的ID是12331,12332,12333 该脚本会将这些ID更改为1,2,3并将标识字段重置为4。 所以下一个输入的id将是4。
答案 1 :(得分:0)
你的某个时间可能在将来数百年。除非你在编写 的软件,否则你不必担心。
count_of_users * count_of_sessions * count_of_days < (much less than) MAX(int)
例如:
1000 * 100 * 1000 (~3 years) = 100 million = an order of magnitude less than 1 billion
收集一些指标并进行这样的计算,你可能会发现你的上限很可能是几代人。
答案 2 :(得分:0)
Oracle NUMBER最多可包含38位小数。如果您生成了一个新的ID 每纳秒,那么您将在3.16887646 * 10^21
年之后全部花费。
我们的宇宙大约有14 * 10^9
岁。相信我,你不会很快“花”ID。
(其他数据库有类似的“限制”。)
答案 3 :(得分:0)
您不会用完生成的ID值,但可以使用替换为命令。你可以找到一个很好的参考here。
答案 4 :(得分:0)
正如其他人所指出的那样,您很快就不会用完ID值。我会问另一个问题。你真的需要这个ID吗?如果计算特定于用户和会话,那么在我看来,您已经有了识别行的方法。只需将用户ID和会话ID放在表中,如果需要,也可以使用日期/时间列,并且根本不需要自动生成的ID。
答案 5 :(得分:0)
类型为INT
,从1开始,您可以获得超过20亿的行 - 这对于绝大多数情况来说应该足够了。使用BIGINT
,你可以得到大约 922千兆(922,15个零 - 922'000亿) - 足够你?
如果您从1开始使用INT IDENTITY
,并且每秒插入一行,则在达到20亿限制之前需要66.5 年 ....
如果你从1开始使用BIGINT IDENTITY
,并且每秒插入一千行,那么你需要一个令人难以置信的 2.92亿年达到了922万亿的限制......
答案 6 :(得分:0)
这应该会给你一个表的列表,并告诉你填写每个表的标识列的距离(这应该适用于SQL 2005+)。备用版本(包括SQL 2000版本)可用here。
SELECT QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) AS TableName,
c.name AS ColumnName,
CASE c.system_type_id
WHEN 127 THEN 'bigint'
WHEN 56 THEN 'int'
WHEN 52 THEN 'smallint'
WHEN 48 THEN 'tinyint'
END AS 'DataType',
IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) AS CurrentIdentityValue,
CASE c.system_type_id
WHEN 127 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 9223372036854775807
WHEN 56 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 2147483647
WHEN 52 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 32767
WHEN 48 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 255
END AS 'PercentageUsed'
FROM sys.columns AS c
INNER JOIN
sys.tables AS t
ON t.[object_id] = c.[object_id]
WHERE c.is_identity = 1
ORDER BY PercentageUsed DESC