2016-03-02 41 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不一定在明年使用用法,但如果您實施自己的解決方案,則可以使用它們。

我希望這個答案能幫助你。