我目前正在使用mysql做一个项目,并且是一个完美的初学者......
我用以下列做了一个表.....
ID // A integer type column which is a primary key........
Date // A Date type column.........
Day // A String column.........
现在我只想知道是否存在自动生成ID
列插入值的方法 ...... ??
例如: - 如果我插入date - 4/10/1992
和Day - 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值。
答案 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是安全的,并且碰撞的可能性非常小(与在不同机器上生成自动递增的整数相反)。