2016-03-02 28 views
0

我需要某些我不知道是否可以实现的内容。基本上,我会从Java与表结构来添加新的信息行到数据库,例如:在数据库中插入新行时的增量ID

Number | Color | Size 

    0 | Red | Big 

    1 | Green | Small 

    2 | Yellow| Medium 

我使用Java和我只输入的颜色和尺码,我想知道是否可以创建一个将数据库端存储变量Number(id)的触发器,并且每次执行将新行插入数据库时​​都会增加它。我正在考虑做一些类似于“INSERT INTO table((null),'Red','Big'),然后数据库会用适当的数字更新该值。还应该可以用事实证明某些行例如:如果我有ID的0,1,2和我删除1,下一行应该仍然是3.

另一件事,我使用的是Sybase SQL,它可以被删除,但它不会影响任何内容,例如:任何地方12做到这一点。

+1

查找Sybase的'identity'列。 –

回答

1

正如@Gordon Linoff说...

标识列这样做,例如...

create table T1 (ID int identity(1,1), Name nvarchar(100)) 

在这种情况下,你会去...

insert into T1 (Name) values ('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,它不会填充“丢失的数字”

+0

感谢您的意见,但我想问一问,如果我有更多专栏,例如ID,姓名和年龄,我将如何继续? 更具体地说,插入查询,我coudln't弄出来 **编辑**:只是想出了毕竟嘿..会是这样的: 插入T1(姓名,年龄)值('约翰','20') – JDev

+1

干得好男人!作为身份的列,你永远不会放入插入语句,因为它们是自增的。祝你好运 – Veljko89

1

有几种解决方案可以满足您的要求,但这些解决方案在几个方面不同,您应该决定选择最好的一个。

DB上下文中存在一些解决方案。 (例如@Gregory答案), ,但其他一些解决方案独立于数据库类型和特定功能。这意味着你实现了独立于你的数据库类型的解决方案,你可以改变你的数据库(oracle,sql-server,my-sql,...),并且不需要改变你的java代码。在jpa中有 有三种序列策略用@GeneratedValue来解决这个问题。

1)表排序:你在你的数据库中为此使用一个单独的表。此表为其他具有自动增量列的表保留适当的ID,并使用此策略。

2)序列对象:你在db和jpa中使用序列对象来处理它。序列对象仅在某些数据库(如Oracle,DB2和Postgres)中受支持。

3)身份排序:在数据库中使用特殊的IDENTITY列,以允许数据库在插入行时自动为该对象分配一个ID。许多数据库支持标识列,例如MySQL,DB2,SQL Server,Sybase和PostgreSQL。Oracle不支持IDENTITY列,但可以使用序列对象和触发器来模拟它们。

如果你想独立于你的数据库类型,我建议你在jpa中使用“表策略”。

有关详细信息,请参阅Java Persistence/Identity and Sequencing

你问:

我想知道,如果有可能,每次创建一个触发器,将 存储变量号(ID),在数据库方面,并增加它 我做一个插入一个新的行进入数据库。

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

也应尽可能与事实裸某些行可以 删除,但won'shouldn't影响什么

在JPA解决方案已删除的id不一定在明年使用用法,但如果您实施自己的解决方案,则可以使用它们。

我希望这个答案能帮助你。