发明内容
本发明实施例所要解决的技术问题在于,提供一种数据库主键的生成方法和装置,可以实现生成唯一的主键值,确保数据库中所有数据表的主键值不重复,且具有高效的特点。
为了解决上述技术问题,本发明实施例提供了一种数据库主键的生成方法,包括:
在数据库中建立主键数据表,所述主键数据表中存储有多个不重复的主键值;
当获取到主键生成指令时,从所述主键数据表中获取预设数量的主键值保存在内存中;
从内存中的所述预设数量的主键值中,获取至少一个主键值分配给目标数据表作为其中至少一个数据的对应的主键值。
在第一方面的第一种可能实现方式中,所述在数据库中建立主键数据表,包括:
以递增的方式,或不重复随机数的方式生成多个主键值;
在数据库中建立存储有所述多个主键值的所述主键数据表。
结合第一方面的可能实现方式,在第二种可能实现方式中,所述当获取到主键生成指令时,从所述主键数据表中获取预设数量的主键值保存在内存中,包括:
当获取到主键生成指令时,锁定所述主键数据表以阻止其它指令从所述主键数据表中获取主键值;
从所述主键数据表中获取预设数量的主键值保存在内存中,并解除锁定所述主键数据表。
结合第一方面的可能实现方式,在第三种可能实现方式中,所述从所述主键数据表中获取预设数量的主键值保存在内存中之后,还包括:
将所述主键数据表中被获取的所述预设数量的主键值标记为已获取状态。
结合第一方面以及第一方面的第一种可能实现方式,在第四种可能实现方式中,所述从内存中的所述预设数量的主键值中,获取至少一个主键值分配给目标数据表作为其中至少一个数据的对应的主键值之后,还包括:
若已分配完内存中的所述预设数量的主键值,则从所述主键数据表中获取未被标记为所述已获取状态的预设数量的主键值保存在内存中。
相应地,本发明实施例还提供了一种数据库主键的生成装置,包括:
数据表建立模块,用于在数据库中建立主键数据表,所述主键数据表中存储有多个不重复的主键值;
主键值获取模块,用于当获取到主键生成指令时,从所述主键数据表中获取预设数量的主键值保存在内存中;
主键值分配模块,用于从内存中的所述预设数量的主键值中,获取至少一个主键值分配给目标数据表作为其中至少一个数据的对应的主键值。
在第一方面的第一种可能实现方式中,所述数据表建立模块,包括:
主键值生成单元,用于以递增的方式,或不重复随机数的方式生成多个主键值;
数据表建立单元,用于在数据库中建立存储有所述多个主键值的所述主键数据表。
结合第一方面的可能实现方式,在第二种可能实现方式中,所述主键值获取模块,具体用于:
当获取到主键生成指令时,锁定所述主键数据表以阻止其它指令从所述主键数据表中获取主键值;
从所述主键数据表中获取预设数量的主键值保存在内存中,并解除锁定所述主键数据表。
结合第一方面的可能实现方式,在第三种可能实现方式中,所述生成装置还包括:
状态标记模块,用于将所述主键数据表中被获取的所述预设数量的主键值标记为已获取状态。
结合第一方面以及第一方面的第一种可能实现方式,在第四种可能实现方式中,所述主键值获取模块,还用于若已分配完内存中的所述预设数量的主键值,则从所述主键数据表中获取未被标记为所述已获取状态的预设数量的主键值保存在内存中。
实施本发明实施例,具有如下有益效果:本发明实施例先在数据库中建立主键数据表,其中主键数据表中存储有多个不重复的主键值,然后当获取到主键生成指令时,从主键数据表中获取预设数量的主键值保存在内存中,接着从中获取至少一个主键值分配给目标数据表作为其中至少一个数据的对应的主键值,由于主键数据表中的主键值不重复,而用于生成目标数据表的主键值来源于该主键数据表,故可以确保生成的数据表的主键值是唯一的,进而可确保数据库中所有数据表的主键值不重复,另外,由于预先从主键数据表中获取预设数量的主键值保存在内存中,故分配主键值时只需从内存中读取,避免反复多次访问数据库的主键数据表,具有高效的特点。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是本发明实施例中一种数据库主键的生成方法的流程示意图。如图所示本实施例中的数据库主键的生成方法的流程可以包括:
S101,在数据库中建立主键数据表,所述主键数据表中存储有多个不重复的主键值。
所述数据库包括至少一个数据表,数据表用于存储数据,主键用于标识数据表中存储的数据,主键可以用数值来表示,该数值即主键值。
需要指出的是,主键值的参数类型可以是多种,例如十进制整数、二进制整数、十六进制整数等,这里不作限定,另外主键值的位数也不作限定,例如八位二进制、四位十六进制等。本发明实施例可根据需要的类别,在主键数据表中增加相应的类别即可。
具体的,在数据库中建立主键数据表的方法可通过以下步骤来实现:
步骤1,以递增的方式,或不重复随机数的方式生成多个主键值。
所述递增的方式,可以是依序递增,例如1、2、3、…….、1000,也可以是间序递增,例如1、4、7、……、1000等。所述不重复随机数的方式,可例如0xf1、0x85、…….、0xc6等。由此可见,生成的主键值不会出现重复,确保其唯一性。
步骤2,在数据库中建立存储有所述多个主键值的所述主键数据表。
具体实现过程中,在数据库中建立一个主键数据表,将之前生成的主键值存储在该主键数据表中。
S102,当获取到主键生成指令时,从所述主键数据表中获取预设数量的主键值保存在内存中。
所述主键生成指令由应用程序或者线程发起,当其代码需要使用主键时将发出主键生成指令。所述预设数量可以根据实际情况(如每小时新增到数据库的数据存储量)来设定。
作为一个可选的实施例,当获取到应用程序发出的主键生成指令时,从主键数据表中获取一段主键值(如500个),并将其保存在内存中以便调用。
进一步可选的,具体实现过程中,当获取到主键生成指令时,先锁定主键数据表以阻止其它指令从主键数据表中获取主键值,再从主键数据表中获取预设数量的主键值保存在内存中,并解除锁定主键数据表。需要指出的是,通过锁定主键数据表,可避免主键数据表中的主键值被重复获取,以确保主键值的唯一性。例如,应用程序A发出主键生成指令,此时将会执行从主键数据表中获取一段主键值保存在内存中,若在尚未获取成功的时候,应用程序B也发出主键生成指令,则将从主键数据表中继续获取该段主键值,导致同一段主键值被获取了两次。而锁定主键数据表的情况下,其它指令当前则不能从主键数据表中获取主键值,直到解除锁定主键数据表后方可获取主键值,确保了主键值的唯一性。
另可选的,从主键数据表中获取预设数量的主键值保存在内存中之后,将主键数据表中被获取的预设数量的主键值标记为已获取状态。
S103,从内存中的所述预设数量的主键值中,获取至少一个主键值分配给目标数据表作为其中至少一个数据的对应的主键值。
所述目标数据表即常用的用于存储数据的数据表,其中存储的数据需要用到主键值来标识。作为一个可选的示例,从内存中的500个主键值中,获取20个主键值分配给目标数据表作为其中20个数据的对应的主键值。需要指出的是,由于预先从主键数据表中获取预设数量的主键值保存在内存中,故分配主键值时只需从内存中读取,避免反复多次访问数据库的主键数据表,具有高效的特点。
相应可选的,若已分配完内存中的预设数量的主键值,则从主键数据表中获取未被标记为已获取状态的预设数量的主键值保存在内存中。作为一个可选的实施例,若从主键数据表中获取并存于内存的一段主键值(如500个)已分配完,则从主键数据表中再获取下一段主键值(如500个)保存在内存中,其中上述前一段主键值已被标记为已获取状态,后一段主键值在获取后也会被标为已获取状态。通过该方法,也可确保了主键值的唯一性。
本发明实施例先在数据库中建立主键数据表,其中主键数据表中存储有多个不重复的主键值,然后当获取到主键生成指令时,从主键数据表中获取预设数量的主键值保存在内存中,接着从中获取至少一个主键值分配给目标数据表作为其中至少一个数据的对应的主键值,由于主键数据表中的主键值不重复,而用于生成目标数据表的主键值来源于该主键数据表,故可以确保生成的数据表的主键值是唯一的,进而可确保数据库中所有数据表的主键值不重复,另外,由于预先从主键数据表中获取预设数量的主键值保存在内存中,故分配主键值时只需从内存中读取,避免反复多次访问数据库的主键数据表,具有高效的特点。
图2是本发明实施例中另一种数据库主键的生成方法的流程示意图,可以包括:
S201,以递增的方式,或不重复随机数的方式生成多个主键值。
为了便于理解,这里先介绍下数据库,所述数据库包括至少一个数据表,数据表用于存储数据,主键用于标识数据表中存储的数据,主键可以用数值来表示,该数值即主键值。
需要指出的是,主键值的参数类型可以是多种,例如十进制整数、二进制整数、十六进制整数等,这里不作限定,另外主键值的位数也不作限定,例如八位二进制、四位十六进制等。本发明实施例可根据需要的类别,在主键数据表中增加相应的类别即可。
所述递增的方式,可以是依序递增,例如1、2、3、…….、1000,也可以是间序递增,例如1、4、7、……、1000等。所述不重复随机数的方式,可例如0xf1、0x85、…….、0xc6等。由此可见,生成的主键值不会出现重复,确保其唯一性。
S202,在数据库中建立存储有所述多个主键值的所述主键数据表。
具体的,在数据库中建立一个主键数据表,将之前生成的主键值存储在该主键数据表中。
S203,当获取到主键生成指令时,从所述主键数据表中获取预设数量的主键值保存在内存中。
所述主键生成指令由应用程序或者线程发起,当其代码需要使用主键时将发出主键生成指令。所述预设数量可以根据实际情况(如每小时新增到数据库的数据存储量)来设定。
作为一个可选的实施例,当获取到应用程序发出的主键生成指令时,从主键数据表中获取一段主键值(如500个),并将其保存在内存中以便调用。
进一步可选的,具体实现过程中,当获取到主键生成指令时,先锁定主键数据表以阻止其它指令从主键数据表中获取主键值,再从主键数据表中获取预设数量的主键值保存在内存中,并解除锁定主键数据表。需要指出的是,通过锁定主键数据表,可避免主键数据表中的主键值被重复获取,以确保主键值的唯一性。例如,应用程序A发出主键生成指令,此时将会执行从主键数据表中获取一段主键值保存在内存中,若在尚未获取成功的时候,应用程序B也发出主键生成指令,则将从主键数据表中继续获取该段主键值,导致同一段主键值被获取了两次。而锁定主键数据表的情况下,其它指令当前则不能从主键数据表中获取主键值,直到解除锁定主键数据表后方可获取主键值,确保了主键值的唯一性。
S204,将所述主键数据表中被获取的所述预设数量的主键值标记为已获取状态。
S205,从内存中的所述预设数量的主键值中,获取至少一个主键值分配给目标数据表作为其中至少一个数据的对应的主键值。
所述目标数据表即常用的用于存储数据的数据表,其中存储的数据需要用到主键值来标识。作为一个可选的示例,从内存中的500个主键值中,获取20个主键值分配给目标数据表作为其中20个数据的对应的主键值。需要指出的是,由于预先从主键数据表中获取预设数量的主键值保存在内存中,故分配主键值时只需从内存中读取,避免反复多次访问数据库的主键数据表,具有高效的特点。
S206,若已分配完内存中的所述预设数量的主键值,则从所述主键数据表中获取未被标记为所述已获取状态的预设数量的主键值保存在内存中。
作为一个可选的实施例,若从主键数据表中获取并存于内存的一段主键值(如500个)已分配完,则从主键数据表中再获取下一段主键值(如500个)保存在内存中,其中上述前一段主键值已被标记为已获取状态,后一段主键值在获取后也会被标为已获取状态。通过该方法,也可确保了主键值的唯一性。
本发明实施例先在数据库中建立主键数据表,其中主键数据表中存储有多个不重复的主键值,然后当获取到主键生成指令时,从主键数据表中获取预设数量的主键值保存在内存中,接着从中获取至少一个主键值分配给目标数据表作为其中至少一个数据的对应的主键值,由于主键数据表中的主键值不重复,而用于生成目标数据表的主键值来源于该主键数据表,故可以确保生成的数据表的主键值是唯一的,进而可确保数据库中所有数据表的主键值不重复,另外,由于预先从主键数据表中获取预设数量的主键值保存在内存中,故分配主键值时只需从内存中读取,避免反复多次访问数据库的主键数据表,具有高效的特点。
图3是本发明实施例中一种数据库主键的生成装置的结构示意图。如图所示本发明实施例中的生成装置至少可以包括数据表建立模块310、主键值获取模块320以及主键值分配模块330,其中:
数据表建立模块310,用于在数据库中建立主键数据表,所述主键数据表中存储有多个不重复的主键值。具体实现中,数据表建立模块310可以如图4所示进一步包括主键值生成单元311和数据表建立单元312,其中:
主键值生成单元311,用于以递增的方式,或不重复随机数的方式生成多个主键值。
为了便于理解,这里先介绍下数据库,所述数据库包括至少一个数据表,数据表用于存储数据,主键用于标识数据表中存储的数据,主键可以用数值来表示,该数值即主键值。
需要指出的是,主键值的参数类型可以是多种,例如十进制整数、二进制整数、十六进制整数等,这里不作限定,另外主键值的位数也不作限定,例如八位二进制、四位十六进制等。本发明实施例可根据需要的类别,在主键数据表中增加相应的类别即可。
所述递增的方式,可以是依序递增,例如1、2、3、…….、1000,也可以是间序递增,例如1、4、7、……、1000等。所述不重复随机数的方式,可例如0xf1、0x85、…….、0xc6等。由此可见,生成的主键值不会出现重复,确保其唯一性。
数据表建立单元312,用于在数据库中建立存储有所述多个主键值的所述主键数据表。
具体的,数据表建立单元312在数据库中建立一个主键数据表,将主键值生成单元311生成的主键值存储在该主键数据表中。
主键值获取模块320,用于当获取到主键生成指令时,从所述主键数据表中获取预设数量的主键值保存在内存中。
所述主键生成指令由应用程序或者线程发起,当其代码需要使用主键时将发出主键生成指令。所述预设数量可以根据实际情况(如每小时新增到数据库的数据存储量)来设定。
作为一个可选的实施例,当获取到应用程序发出的主键生成指令时,从主键数据表中获取一段主键值(如500个),并将其保存在内存中以便调用。
进一步可选的,具体实现过程中,当获取到主键生成指令时,先锁定主键数据表以阻止其它指令从主键数据表中获取主键值,再从主键数据表中获取预设数量的主键值保存在内存中,并解除锁定主键数据表。需要指出的是,通过锁定主键数据表,可避免主键数据表中的主键值被重复获取,以确保主键值的唯一性。例如,应用程序A发出主键生成指令,此时将会执行从主键数据表中获取一段主键值保存在内存中,若在尚未获取成功的时候,应用程序B也发出主键生成指令,则将从主键数据表中继续获取该段主键值,导致同一段主键值被获取了两次。而锁定主键数据表的情况下,其它指令当前则不能从主键数据表中获取主键值,直到解除锁定主键数据表后方可获取主键值,确保了主键值的唯一性。
主键值分配模块330,用于从内存中的所述预设数量的主键值中,获取至少一个主键值分配给目标数据表作为其中至少一个数据的对应的主键值。
所述目标数据表即常用的用于存储数据的数据表,其中存储的数据需要用到主键值来标识。作为一个可选的示例,从内存中的500个主键值中,获取20个主键值分配给目标数据表作为其中20个数据的对应的主键值。需要指出的是,由于预先从主键数据表中获取预设数量的主键值保存在内存中,故分配主键值时只需从内存中读取,避免反复多次访问数据库的主键数据表,具有高效的特点。
可选的,请参阅图3,如图所示本发明实施例中的生成装置还可以包括状态标记模块340,用于将所述主键数据表中被获取的所述预设数量的主键值标记为已获取状态。
相应的,主键值获取模块320,还用于若已分配完内存中的所述预设数量的主键值,则从所述主键数据表中获取未被标记为所述已获取状态的预设数量的主键值保存在内存中。
作为一个可选的实施例,若从主键数据表中获取并存于内存的一段主键值(如500个)已分配完,则从主键数据表中再获取下一段主键值(如500个)保存在内存中,其中上述前一段主键值已被标记为已获取状态,后一段主键值在获取后也会被标为已获取状态。通过该方法,也可确保了主键值的唯一性。
本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分可以通过计算机软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟或光盘)中,包括若干指令用以执行本发明实施例图1~图2所描述的数据库主键的生成方法中的部分或全部的步骤。
本发明实施例先在数据库中建立主键数据表,其中主键数据表中存储有多个不重复的主键值,然后当获取到主键生成指令时,从主键数据表中获取预设数量的主键值保存在内存中,接着从中获取至少一个主键值分配给目标数据表作为其中至少一个数据的对应的主键值,由于主键数据表中的主键值不重复,而用于生成目标数据表的主键值来源于该主键数据表,故可以确保生成的数据表的主键值是唯一的,进而可确保数据库中所有数据表的主键值不重复,另外,由于预先从主键数据表中获取预设数量的主键值保存在内存中,故分配主键值时只需从内存中读取,避免反复多次访问数据库的主键数据表,具有高效的特点。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。