2

我目前正在使用 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 服务器应该从1检查它们是否存在开始自动生成任何整数值。 即在包含值的表中

             ID              Date              Day

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

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

             2              04/10/1992         WED

我尝试了使用自动增量器之类的方法.....但恐怕它只会增加 ID 值。

4

3 回答 3

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

诀窍有点复杂,我担心....不存在您期望的简单方法....

于 2012-06-28T15:54:38.960 回答
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。

于 2012-06-23T14:04:18.017 回答
0

您真的不需要覆盖从整数主键列中删除值所产生的空白。它们专门设计用于忽略这些差距。

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

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

你甚至不能节省空间,因为当你决定你的表将使用SMALLINT一个固定长度的 2 字节整数时,无论这些值是全 0 还是最大值都没有关系。如果你使用一个INTEGER固定长度的 4 字节整数的法线。

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

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

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

可以像将 UUIDBINARY(16)转换为原始二进制文件一样存储 UUID,就像CHAR(32)去掉破折号或CHAR(36)留下破折号一样。

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

于 2012-06-26T21:41:01.767 回答