1. 程式人生 > >sql 自增欄位 int identity(1,1)

sql 自增欄位 int identity(1,1)

sql 自增號

2009-06-16 10:47

1: 自增列 型別為:int identity(1,1) 當然也可以是bigint,smallint
eg: create table tbName(id int identity(1,1),descriptionvarchar(20))
或在用企業管理器設計表字段時,將欄位設為int,將標識設為是,其它用預設即可

IDENTITY (給SQL 的 select 語句新增一個自動遞增的ID欄位)

select id1=identity(int,1,1) , * into #test from tb
select * from #test

@@identity是表示的是最近一次向具有identity屬性(即自增列)的表插入資料時對應的自增列的值,是系統定義的全域性變數。一般系統定義的全域性變數都是以@@開頭,使用者自定義變數以@開頭。比如有個表A,它的自增列是id,當向A表插入一行資料後,如果插入資料後自增列的值自動增加至101,則通過[email protected]@identity得到的值就是101。使用@@identity的前提是在進行insert操作後,執行[email protected]@identity的時候連線沒有關閉,否則得到的將是NULL值。

我的例子:--查詢時加子增列(需要用到)
select identity(int,1,1) as id,newid()

as Guid,qq into #tp fromQQ--(QQ(qq(nvarchar(11))))

select * from #tp

drop table #tp
select @@identity

2: 查詢時加序號:
a:沒有主鍵的情形: (注意語法:Select identity(int,1,1) as iid,* into #tmp fromTableName   )
Select identity(int,1,1) as iid,* into #tmp from TableName
Select * from #tmp
Drop table #tmp
b:有主鍵的情形:
Select (Select sum(1) from TableName where KeyField<= a.KeyField) as iid,* from TableNamea  
3:生成自增序列號的表
eg: 生成一列0-30的數
Select top 30 (select sum(1) from sysobjects wherename<= a.name)-1 as id from sysobjects a

當然,可能sysobjects 中沒有這麼多條記錄,比如只有100條,我需生成1-800的序列號
如下處理:
Select (Select sum(1) from (Select top 800 a.name as name1,b.nameas name2 from sysobjects a ,sysobjects b) cc wherename1<= dd.name1 and name2 <=dd.name2 ) from
(Select top 800 a.name as name1,b.name as name2 from sysobjects a,sysobjects b) dd


應用舉例
eg1:
create table t(日期 char(8),請假人數 int)
insert t select '20031001',3
Union all select '20031003',2
Union all select '20031004',1
Union all select '30031031',5
要列出2003年10月每一天的請假人數,若沒有,以0表示。

Selectconvert(char(8),dateadd(day,id,'20031001'),112),IsNull(t.請假人數,0)from
(Select top 31 (select sum(1) from sysobjects wherename<= a.name)-1 as id from sysobjects a) bb
left join t on convert(char(8),dateadd(day,id,'20031001'),112) =t.日期



eg2: 生成隨機考勤打卡資料:

declare @r int
--得到要處理的記錄數
set @r=900

--建立得到隨機時間的臨時表
create table #tb(id int identity(1,1),dt1 datetime,dt2 datetime,dt3datetime,dt4 datetime,dt5 datetime,dt6 datetime)

--生成隨機時間
declare @sql varchar(8000)
set @sql='insert into #tb(dt1,dt2,dt3,dt4,dt5,dt6) select top'+cast(@r as varchar)+'
dateadd(ss,rand(a.id)*1800,''07:30''),
dateadd(ss,rand(a.id+1)*400,''11:30''),
dateadd(ss,rand(a.id+2)*1600,''13:00''),
dateadd(ss,rand(a.id+3)*300,''17:30''),
dateadd(ss,rand(a.id+4)*800,''17:45''),
dateadd(ss,rand(a.id+5)*250,''20:00'')
from(select top 100 id from sysobjects) a,
(select top 9 id from sysobjects) b
order by newid()
exec(@sql)
當然,如果將07:30 11:30...這些時間改成排班時間就更好了。  
4: 好多單號都是自動增長,但又不能用自增列代替
eg: P031106001 -- 第一位P表示採購單,031106表示日期,後三位是流水號。 
 如下處理:(編號規則不同時稍加修改即可)

先建一個自定義函式
create function getDH()
returns char(10)
As
begin
declare @dh1 char(10),@dh2 char(10)
select @dh1 = max(dh) from tableName
Set @dh1 = IsNull(@dh1,'P000000000')
set @dh2 = Left(@dh1,1) +right(convert(varchar(8),getdate(),112),6) + '001'
if @dh1 >= @dh2
begin
set @dh2 = left(@dh1,7) + right('000'+ cast(cast(right(@dh1,3) asint)+1 as varchar),3)
end
return(@dh2)
end



然後在欄位預設值中填入 dbo.getdh()


4: 好多單號都是自動增長,但又不能用自增列代替
eg: P031106001 -- 第一位P表示採購單,031106表示日期,後三位是流水號。 
 如下處理:(編號規則不同時稍加修改即可)

因在自定義函式內不能用getdate(),先建一個檢視
create view vGetdate
as
select getdate() as today


先建一個自定義函式
create function getDH()
returns char(10)
As
begin
declare @dh1 char(10),@dh2 char(10)
select @dh1 = max(dh) from tableName
Set @dh1 = IsNull(@dh1,'P000000000')
select @dh2 = Left(@dh1,1) + right(convert(varchar(8),today,112),6)+ '001' from vGetdate
if @dh1 >= @dh2
begin
set @dh2 = left(@dh1,7) + right('000'+ cast(cast(right(@dh1,3) asint)+1 as varchar),3)
end
return(@dh2)
end



然後在欄位預設值中填入 dbo.getdh()  
--自已做標識列的例子:

--建立得到最大id的函式
create function f_getid()
returns int
as
begin
declare @id int
select @id=max(id) from tb
set @id=isnull(@id,0)+1
return(@id)
end
go

--建立表
create table tb(id int default dbo.f_getid(),namevarchar(10))
go

--建立觸發器,在刪除表中的記錄時,自動更新記錄的id
create trigger t_delete on tb
AFTER delete
as
declare @id int,@mid int
select @mid=min(id),@

[email protected] from deleted
update tb set [email protected],@[email protected]+1 where id>@mid
go

--插入記錄測試
insert into tb(name) values('張三')
insert into tb(name) values('張四')
insert into tb(name) values('張五')
insert into tb(name) values('張六')
insert into tb(name) values('張七')
insert into tb(name) values('張八')
insert into tb(name) values('張九')
insert into tb(name) values('張十')

--顯示插入的結果
select * from tb

--刪除部分記錄
delete from tb where name in('張五','張七','張八','張十')

--顯示刪除後的結果
select * from tb

--刪除環境
drop table tb
drop functionf_getid 

相關推薦

sql int identity(1,1)

   ) Select identity(int,1,1) as iid,* into #tmp from TableName Select * from #tmp Drop table #tmp b:有主鍵的情形: Select (Select sum(1) from TableName where Key

sql int identity(1,1)

sql 自增號 2009-06-16 10:47 1: 自增列 型別為:int identity(1,1) 當然也可以是bigint,smallint eg: create table tbName(id int identity(1,1),descriptionvarc

sql server怎麼設定ID

①開啟要設定的資料庫表,點選要設定的欄位,比如id,這時下方會出現id的列屬性表 ②列屬性中,通過設定“標識規範”的屬性可以設定欄位自增,將“是標識”的值改為是,即成功設定id欄位為自增欄位 ③注意! 能夠設定ID欄位自增的欄位必須是可自增的,比如int,bigint型別,而varch

SQL server中設定

  sqlserver中的自增欄位(就象ORACLE中的序列號SEQUENCE)是什麼?怎麼用?1.CREATE   TABLE   表名(     欄位名   [int]   IDENTITY   (1,   1)   NOT   NULL   ,     ...

Mysql的小常識

SHOW VARIABLES LIKE ‘auto_inc%’; //檢視mysql當前檢視當前資料庫的自增長設定 auto_increment_increment //這是自增長的步長。 auto_increment_offset //這是自增長開始的值。 SET @@auto

MySQL使用需要注意的事項(Day06)

原文為博主原創,整理筆記實屬不易,如若轉載,請註明出處 在系統開發中,我們經常要用到唯一編號,使用過MySQL的人都知道,MySQL有一個定義列為自增的屬性,叫做auto_increment,在這裡需要注意的是,anto_increment用來為設定自動編號,每一表只能有一

MySQL設定的方法介紹

如何實現MySQL設定自增欄位是許多人都問到的問題,下面就為您介紹MySQL設定自增欄位的相關知識,希望對您學習MySQL資料庫能有所啟迪。 MySQL設定自增欄位的相關語句: alter table album change ALBUM_ID ALBUM_ID bigi

sqlite3key設定(建立)

在用sqlite設計表時,每個表都有一個自己的整形id值作為主鍵,其實可以不指定這麼一個id值,sqlite內部本來就會為每個表加上一個 rowid,這個rowid可以當成一個隱含的欄位使用,但是由sqlite引擎來維護的,在3.0以前rowid是32位的整數,3.0以後是

Oracle建立

1.首先建立要使用的表 CREATE TABLE DEMO_TEST( OID NUMBER(11) PRIMARY KEY, NAME VARCHAR2(30) ) 2.建立自增序列 CREATE SEQUENCE DEMO_SEQUENCE INCREM

jpa 自動新增 報錯 “error performing isolated work”

在使用Jpa對資料庫進行操作是時,設定的自增欄位在進行插入操作時也必須set,否則會報錯新增失敗。使用 @GeneratedValue 註解能實現自增欄位自動新增。但是使用 @GeneratedValue 會報錯 “error performing isolated work

jpa 自動新增 報錯 “error performing isolated work”

在使用Jpa對資料庫進行操作是時,設定的自增欄位在進行插入操作時也必須set,否則會報錯新增失敗。 使用 @GeneratedValue 註解能實現自增欄位自動新增。 但是使用 @GeneratedValue 會報錯 “error performing is

mysql處理刪除之後下一次插入資料的問題

用資料庫的時候經常會有一個id是自增的情況,如果你直接把整個庫的資料刪除之後,下一次插入資料會發現id會從刪除前資料的最大id開始自增,如果你想繼續從1開始的話,可以輸入 truncate table

MYsql---新增

新增自增欄位有以下幾種方法:1.使用Navicat Premium連結MYsql資料庫,找到表下對應的表名,右鍵開啟設計表,然後點選新增欄位設定新增欄位的型別,要注意兩點:a.自增欄位不能為空 b.自增欄位必須為主鍵儲存完成後就可以正常,使用了,看下成果。2.當然也可以在建表

hibernate通過註解設定

簡單版: @Id @GeneratedValue(strategy=GenerationType.IDENTITY)  設定大小版: @GeneratedValue(strategy=Generati

django定義非主鍵型別(auto increment field)

1.django自定義欄位型別,實現非主鍵欄位的自增 # -*- encoding: utf-8 -*- from django.db.models.fields import Field, IntegerField from django.core i

mysql資料庫新增非主鍵

我們直接向表中新增自增的非主鍵欄位時會報錯,錯誤資訊如下: 該資訊提示我們設為自增的欄位必須作為鍵(並非一定是主鍵)。 所以我們可以這樣做: (1)先新增欄位,設定欄位型別等基本屬性:     alter table tbl_test add

MySQL的設定方法

在資料庫應用,我們經常要用到唯一編號。在MySQL中可通過欄位的AUTO_INCREMENT屬性來自動生成。MySQL支援多種資料表,每種資料表的自增屬性都有所不同。 ISAM表 如果把一個NULL插入到一個AUTO_INCREMENT資料列裡去,MySQL將自動生成下一個序列編號。編號從1開始,並1為

MYSQL 中利用insert對進行插值

 mysql的insert/replace/update/delete & insert,update,delete多表操作 2008-03-28 15:44:10 from WriteDream INSERT和REPLACE語句的功能都是向表中插入新的資料。這兩條

mysql已存在的表增加

需求: 已有的mysql資料表,希望增加一個自增的欄位,並設定新資料的初始值。 實際上不復雜,只是做個備忘。 測試表 CREA

sharepoint 2010 定義開發(1) 建立一個簡單的列表定義

在sharepoint 2010 中,最常用的就是對自定義列表或者文件庫的使用,建立一個自定義列表或者文件庫,新增一些需要的欄位,sharepoint 2010 自帶了很多不同型別的控制元件供欄位使用,如下圖 很多特殊情況下,這些型別控制元件,不一定能滿足我們的需求,所以