Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在数据库中插入新行时的增量ID_Java_Sql_Triggers_Insert_Increment - Fatal编程技术网

Java 在数据库中插入新行时的增量ID

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’,

我需要一些我不知道是否可能实现的东西。基本上,我将从java向具有表结构的数据库添加新行信息,例如:

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)存储在数据库端,并递增 每次我在数据库中插入新行时

是的,您可以使用触发器,但正如我提到的,有一些更简单的解决方案,而不是它

还应该可以暴露出这样一个事实,即某些行可以 已删除,但不会影响任何内容