主键索引自动

时间:2012-06-23 06:35:55

标签: mysql primary-key primary-key-design

我目前正在使用mysql做一个项目,并且是一个完美的初学者......

我用以下列做了一个表.....

            ID           // A integer type column which is a primary key........
            Date         // A Date type column.........
            Day          // A String column.........

现在我只想知道是否存在自动生成ID 列插入值的方法 ...... ??

例如: - 如果我插入date - 4/10/1992Day - WED作为值。 Mysql Server应自动生成任何整数值,从1开始检查它们是否存在。 即在包含值

的表中
             ID              Date              Day

             1              01/02/1987         Sun
             3              04/08/1990         Sun

如果我在上表中插入Date值和Day值(在示例中指定)。它应该作为

插入
             2              04/10/1992         WED

我尝试过使用自动增量器等方法.....但我担心它只会增加ID值。

3 个答案:

答案 0 :(得分:1)

有一种方法可以做到这一点,但它会影响性能。继续并在列上保留auto_increment,仅用于第一次插入,或者当您想要更快地插入时。

即使列上有auto_increment,您也可以指定该值,只要它不与现有值冲突。

获取下一个值或第一个差距:

SELECT a.ID + 1 AS NextID FROM tbl a
LEFT JOIN tbl b ON b.ID = a.ID + 1
WHERE b.ID IS NULL
ORDER BY a.ID
LIMIT 1

如果你得到一个空集,只需使用1,或让auto_increment做它的事情。

为了实现并发性,您需要锁定表以防止其他会话使用您刚刚找到的下一个ID。

答案 1 :(得分:1)

嗯......我理解你的问题......你想以这样的方式生成条目,它可以控制它的限制......

嗯,我有一个非常糟糕的解决方案......如果你愿意,你可以接受它......

使用unsigned int在自动增量模式下使用主键创建表(如此处所示)....

现在考虑两种情况......

如果您的桌子需要每年或在一定时间内清除(如果存在这种情况)...... perform alter table操作 禁用自动增量模式并删除所有内容... 然后再次启用它......

如果您正在做的是某种数据仓库.....那么数据库多年...... 然后在您插入之前包含sql query to find the smallest primary key value using predefined key functions,如果超过2 ^ 33 create a new table with the same details,您应该maintain a seperate table to track the number of tables of this types

诀窍有点复杂,我害怕......没有像你期望的那样简单的方法......

答案 2 :(得分:0)

您实际上不需要覆盖通过从整数主键列中删除值而产生的间隙。它们的设计特别容忽视这些差距。

自动增量机制可以设计为考虑顶部的间隙(在删除一些具有最大id值的产品之后)或所有间隙。但这并不是因为它的设计不是为了节省空间,而是为了节省时间并确保不同的交易不会意外地生成相同的ID。

实际上PostgreSQL以这样的方式实现它的SEQUENCE数据类型/ SERIAL列(它们相当于MySQL auto_increment),如果事务请求序列增加几次但最终不使用那些ids,他们永远不会被使用。这也是为了避免交易意外生成和使用相同ID的可能性。

您甚至无法节省空间,因为当您决定使用SMALLINT表是固定长度的2字节整数时,如果值全部为0或最大值,则无关紧要。如果使用正常INTEGER,那是一个固定长度的4字节整数。

如果使用UNSIGNED BIGINT这是一个8字节整数,这意味着它使用8 * 8位= 64位。使用8字节整数,您可以计算最多2 ^ 64,即使您的应用程序连续工作数年和数年它也不应该达到20位数字,如18446744070000000000(如果它到底是什么你在计算已知的分子宇宙?)。

但是,假设你真的担心ids可能会在几年后用完,也许你应该使用UUID而不是整数。

维基百科指出“只有在未来100年内每秒产生10亿UUID后,创建一个副本的概率大约为50%”。

如果您将UUID转换为原始二进制文件,则可以将其存储为BINARY(16),如果您删除破折号,则为CHAR(32);如果您留下破折号,则为CHAR(36)

在16字节= 128位数据中,UUID使用122个随机位和6个验证位,并使用有关创建时间和位置的信息构建它们。这意味着在不同的计算机上创建数十亿个UUID是安全的,并且碰撞的可能性非常小(与在不同机器上生成自动递增的整数相反)。