資料庫自增長主鍵
『壹』 關於如何獲得資料庫插入操作中數據的自增長主鍵的值
有時在做數據插入操作時需要獲得剛剛插入數據的主鍵值,由於主鍵是自增長,並且可能存在並發的情況,所以不能使用資料庫最後一條記錄來確定。
當然如果使用hibernate的話hibernate會主動幫你獲得主鍵,但項目可能碰到這樣的需求插入就使用hibernate來處理。從網上搜索了很多解決方案,並在查看了MYsql的文檔後找到了在MYSQL中的解決方案。
在MYSQL中可以使用select @@identity;來查詢最後一條插入自增長的鍵值,select @@identity;查詢的是當前作用域的自增長鍵值,也就是當前Connection的,所以在同一個Connection操作下可以在插入一條記錄後在執行select @@identity;查詢出該條記錄的主鍵。在MSSQL中好像也可以這樣查詢,就是不知道查詢出來的作用域是否是當前會話的作用域,如果是的話MSSQL也就能採用同樣的方法實現了。
附上一個基本的查詢代碼:
『貳』 mysql資料庫主鍵設置了自增,但是,我把刪除了一些數據,隨後加的數據為什麼會自增ID會接著已經刪除了的
這是資料庫主鍵自增的固然性質所決定的,數據刪除後,主鍵還是會繼續增加的,即主鍵使用過一次將不會再次使用。
例如:這個表中有10條數據,主鍵為1-10不間斷的數字,那刪除第十條數據,繼續插入的話,id則會變成11,而不是10。通俗的說就是主鍵使用過一次將不會再次使用。
每次插入則不需要為主鍵設置參數,資料庫會根據設置的遞增條件,自動給出主鍵值。則第一次插入後主鍵為1,第二次為2,依次遞增。
(2)資料庫自增長主鍵擴展閱讀:
Mysql、SqlServer主鍵自動增長的設置方法:
1、在mysql中把主鍵定義為自動增長標識符類型
如果把表的主鍵設為auto_increment類型,資料庫就會自動為主鍵賦值。例如:
create table customers(id int auto_increment primary key not null, name varchar(15));insert into customers(name) values("name1"),("name2");
2、在MS SQLServer中,如果把表的主鍵設為identity類型,資料庫就會自動為主鍵賦值。例如:
create table customers(id int identity(1,1) primary key not null, name varchar(15));insert into customers(name) values("name1"),("name2");identity包含兩個參數,第一個參數表示起始值,第二個參數表示增量。
『叄』 如何獲得mysql資料庫 自增長主鍵的值
如果是自增長的話,直接用max函數即可。
如表為:
id
name
1
張三
2
李四
3
王五
其中id為自增長欄位,如果要查詢目前主鍵的值,可用如下語句:
select max(id) as id from 表名;結果顯示為:
id
3
就說明目前id的值為3。
『肆』 mysql資料庫怎麼讓id自動增長,但ID不是主鍵。難道只有ID為主鍵時,才可以自增的么
從零蛋娃娃的回復中得到啟示,解決問題。
重新表述需求: id自增長,同時需要一個鍵uniquekey是唯一鍵。
解決方法就是:
把id在索引中設置索引類型為任意一個類型,比如normal,然後unique就可以設置為主鍵了。
或者反過來,id自增長,同時作為主鍵。 uniquekey在索引中索引類型設置為unique即可。
補充:考慮到主鍵能設置成外鍵,所以建議用以上第一種方式。
『伍』 資料庫中的主鍵如何設置為自動增長
數據表上右鍵=》設計=》選中主鍵欄位=》下面有屬性窗口
=》標識規范=》選是,注意主鍵欄位必須是整形的
『陸』 MySQL 資料庫中只有主鍵能自動增長么
不一定的,MySQL 每張表只能有1個自動增長欄位,這個自動增長欄位即可作為主鍵,也可以用作非主鍵使用,但是請注意將自動增長欄位當做非主鍵使用時必須必須為其添加唯一索引,否則系統將會報錯。例如:
1.將自動增長欄位設置為主鍵。
create table t1 (id int auto_increment Primary key,sid int);
2.將自動增長欄位設置為非主鍵,注意必須顯式添加Unique鍵。
create table t2 (sid int primary key,id int auto_increment Unique);
3.將自動增長欄位設置為非主鍵如果未添加唯一索引將會報錯**,如下面語句
create table t3 (sid int primary key,id int auto_increment)。
『柒』 如何獲得mysql資料庫自增長主鍵的值
this.employee_id = employee_id;}} 其它幾個屬性的getter和setter省略,這里我們要用到ejb3-persistence.jar,JPA的註解類就在這個包中,下面詳細說明上面使用到的註解。 @Entity:通過@Entity註解將一個類聲明為一個實體bean @Table:通過 @Table註解可以為實體bean映射指定表,name屬性表示實體所對應表的名稱,如果沒有定義 @Table,那麼系統自動使用默認值:實體的類名(不帶包名) @Id:用於標記屬性的主鍵 @Column:表示持久化屬性所映射表中的欄位,如果屬性名與表中的欄位名相同,則可以省略@Column註解,另外有兩種方式標記,一是放在屬性前,另一種是放在getter方法前,例如: @Column(name = EMPLOYEE_NAME) private String employee_name; 或者 @Column(name = EMPLOYEE_NAME) public String getEmployee_name() { return employee_name; } 這兩種方式都是正解的,根據個人喜好來選擇。大象偏向於第二種,並且喜歡將屬性名與欄位名設成一樣的,這樣可以省掉@Column註解,使代碼更簡潔。 @TableGenerator:表生成器,將當前主鍵的值單獨保存到一個資料庫表中,主鍵的值每次都是從指定的表中查詢來獲得,這種生成主鍵的方式是很常用的。這種方法生成主鍵的策略可以適用於任何資料庫,不必擔心不同資料庫不兼容造成的問題。大象推薦這種方式管理主鍵,很方便,集中式管理表的主鍵,而且更換資料庫不會造成很大的問題。各屬性含義如下: name:表示該表主鍵生成策略的名稱,這個名字可以自定義,它被引用在@GeneratedValue中設置的generator值中 table:表示表生成策略所持久化的表名,說簡單點就是一個管理其它表主鍵的表,本例中,這個表名為GENERATOR_TABLE pkColumnName:表生成器中的列名,用來存放其它表的主鍵鍵名,這個列名是與表中的欄位對應的 pkColumnValue:實體表所對應到生成器表中的主鍵名,這個鍵名是可以自定義滴 valueColumnName:表生成器中的列名,實體表主鍵的下一個值,假設EMPLOYEE表中的EMPLOYEE_ID最大為2,那麼此時,生成器表中與實體表主鍵對應的鍵名值則為3 allocationSize:表示每次主鍵值增加的大小,例如設置成1,則表示每次創建新記錄後自動加1,默認為50@GeneratedValue:定義主鍵生成策略,這里因為使用的是TableGenerator,所以,主鍵的生成策略為GenerationType.TABLE,生成主鍵策略的名稱則為前面定義的」tab-store」。 這里大象想說下,網上有很多文章寫的是strategy = GenerationType.AUTO或是strategy = GenerationType.SEQUENCE,採用SEQUENCE序列是因為Oracle數據中不支持identity自動增長,要想使用它,還得在資料庫中創建一個序列,如果要更換資料庫,那將是一個非常麻煩的事情。SEQUENCE生成方式我們暫且不談,這里說下採用AUTO和IDENTITY的生成方式,本例採用的是SQL Server 2000作為資料庫,所以如果想使用AUTO或是IDENTITY生成策略,則一定要對主鍵加上identity標識,如identity(1,1)。不過對於AUTO來說,是根據不同的資料庫選擇最合適的自增主鍵生成策略。如果使用MySQL,則主鍵要定義AUTO_INCREMENT,如果是Oracle,則要創建Sequence來實現自增。不管採用何種生成策略,增、刪、改這些方法中一定要加入事務,否則數據是不會添加到資料庫中滴~~~這是大象反復測試過的結果!
『捌』 如何設置mysql 主鍵自動增長
如果你資料庫已經建立 用這個方法:
ALTER TABLE `test` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT;
如果你資料庫沒有建立 就用CREATE :
如果你用的資料庫軟體 比如Navicat for MySQL。 那麼在設計表選項里有設置自動增長的,打上勾
『玖』 資料庫設置主鍵的時候用,為什麼設置自動增長
保證程序的正確性,主鍵ID首先具有唯一性,設置自動增長在前台Insert的時候不需要傳入ID的值,資料庫自動根據最後一個ID值增加1
保證資料庫主鍵不重復而且調用更為高效。
假如說沒有設置自動增長
在insert一條記錄的時候需要人為傳遞ID值。要保證唯一性必須要先獲得上條記錄的ID用select
然後再加一
然後在執行insert
從效率方面降低程序的靈活性。
個人見解。