Java 在数据库中插入新行时的增量ID
我需要一些我不知道是否可能实现的东西。基本上,我将从java向具有表结构的数据库添加新行信息,例如:Java 在数据库中插入新行时的增量ID,java,sql,triggers,insert,increment,Java,Sql,Triggers,Insert,Increment,我需要一些我不知道是否可能实现的东西。基本上,我将从java向具有表结构的数据库添加新行信息,例如: Number | Color | Size 0 | Red | Big 1 | Green | Small 2 | Yellow| Medium 我使用java,只输入颜色和大小,我想知道是否有可能创建一个触发器,将变量号(id)存储在数据库端,并在每次向db插入新行时递增。我想做一些类似于“INSERT INTO table((null),‘Red’,
Number | Color | Size
0 | Red | Big
1 | Green | Small
2 | Yellow| Medium
我使用java,只输入颜色和大小,我想知道是否有可能创建一个触发器,将变量号(id)存储在数据库端,并在每次向db插入新行时递增。我想做一些类似于“INSERT INTO table((null),‘Red’,‘Big’)的事情,然后数据库将用正确的数字更新该值。
还应该可以公开一些行可以被删除,但这不会影响任何事情,例如:如果我有ID的0,1,2,并且我删除了1,那么下一行仍然应该是3
另外,我正在使用Sybase SQL Anywhere 12来实现这一点。您应该在数据库中使用autoincrement列 看这个
您应该在数据库中使用自动增量列 看这个
正如@Gordon Linoff所说 标识列正在这样做,例如
create table T1 (ID int identity(1,1), Name nvarchar(100))
在这种情况下,你会去
insert into T1 (Name) values ('John')
因此,您将插入名称“John”,DB本身将给他ID 1
下次插入时,将设置ID 2…以此类推
Identity(1,1) - it means start from 1 and increment it by 1 on new insert
这方面的问题是,一旦取下数字,就不会返回,所以如果您有ID 1、2、3..,并且删除ID 3..,在下一次插入时,ID将上升到4,它将不会像@Gordon Linoff所说的那样填充“缺失的数字” 标识列正在这样做,例如
create table T1 (ID int identity(1,1), Name nvarchar(100))
在这种情况下,你会去
insert into T1 (Name) values ('John')
因此,您将插入名称“John”,DB本身将给他ID 1
下次插入时,将设置ID 2…以此类推
Identity(1,1) - it means start from 1 and increment it by 1 on new insert
关于这一点的事情是,一旦取下这个数字,就不会返回,所以若你们有ID 1,2,3..和删除ID 3..,在下一次插入时,ID将上升到4,它将不会填充“缺失的数字”“有几种解决方案可以满足您的需求,但它们在几个方面有所不同,您应该选择最好的解决方案 数据库上下文中存在一些解决方案。(例如@Gregory answer), 但其他一些解决方案与DB类型和特定功能无关。这意味着您实现的解决方案独立于您的数据库类型,您可以更改您的数据库(oracle、sql server、my sql等),而无需更改java代码。 在jpa中,使用@GeneratedValue有三种顺序策略来解决这个问题 1) 表排序:在数据库中为此目的使用单独的表。此表为具有此策略的自动递增列的其他表保留适当的ID 2) 序列对象:在db中使用序列对象,jpa处理它。序列对象仅在某些数据库中受支持,如Oracle、DB2和Postgres 3) 标识顺序:在数据库中使用特殊的标识列,以允许数据库在插入对象的行时自动为对象分配id。许多数据库都支持标识列,如MySQL、DB2、SQL Server、Sybase和PostgreSQL。Oracle不支持标识列,但可以使用序列对象和触发器模拟它们 如果您想独立于数据库类型,我建议您在jpa中使用“表策略”。 有关详细信息,请参阅 你问: 我想知道是否有可能创造一个触发,将 将变量号(id)存储在数据库端,并递增 每次我在数据库中插入新行时 是的,您可以使用触发器,但正如我提到的,有一些更简单的解决方案,而不是它 还应该可以暴露出这样一个事实,即某些行可以 已删除,但不会影响任何内容 在jpa解决方案中,删除的ID不会在下次使用中使用,但是如果您实现自己的解决方案,您可以使用它们
我希望这个答案对你有帮助 有几种解决方案可以满足您的需求,但它们在几个方面是不同的,您应该选择最好的解决方案 数据库上下文中存在一些解决方案。(例如@Gregory answer), 但其他一些解决方案与DB类型和特定功能无关。这意味着您实现的解决方案独立于您的数据库类型,您可以更改您的数据库(oracle、sql server、my sql等),而无需更改java代码。 在jpa中,使用@GeneratedValue有三种顺序策略来解决这个问题 1) 表排序:在数据库中为此目的使用单独的表。此表为具有此策略的自动递增列的其他表保留适当的ID 2) 序列对象:在db中使用序列对象,jpa处理它。序列对象仅在某些数据库中受支持,如Oracle、DB2和Postgres 3) 标识顺序:在数据库中使用特殊的标识列,以允许数据库在插入对象的行时自动为对象分配id。许多数据库都支持标识列,如MySQL、DB2、SQL Server、Sybase和PostgreSQL。Oracle不支持标识列,但可以使用序列对象和触发器模拟它们 如果您想独立于数据库类型,我建议您在jpa中使用“表策略”。 有关详细信息,请参阅 你问: 我想知道是否有可能创造一个触发,将 将变量号(id)存储在数据库端,并递增 每次我在数据库中插入新行时 是的,您可以使用触发器,但正如我提到的,有一些更简单的解决方案,而不是它 还应该可以暴露出这样一个事实,即某些行可以 已删除,但不会影响任何内容 在