1. 程式人生 > >sql 自動增長的主鍵

sql 自動增長的主鍵

問:SQL Server 2005中設計表時和在SQL Server Management Studio Express中如何得到自動編號欄位?

答:具體步驟如下:

①像Access中的自動編號欄位

右鍵你的表-->設計表-->找到你的id欄位(類int型)-->標識-->是-->標識種子(初始值)-->標識遞增量-->OK

②用IDENTITY (SEED,INCREMENT)引數

seed -啟始值

increment -增量

CREATE TABLE 表名(

你的ID IDENTITY (1, 1) NOT NULL ,你的其他欄位... )

CREATE TABLE 表名(

你的欄位ID AUTOINCREMENT(1000,10),其他欄位... )

③修改起始值和步進值

ALTER TABLE 表名 ALTER COLUMN 你的欄位ID COUNTER(2000,50)

④讓一個刪空的表自動增加欄位的開始值重新從1開始

ALTER TABLE 表名 ALTER COLUMN 你的欄位ID COUNTER(1,1)

上述3 4只適用與Access,COUNTER為其一種資料型別,可以在Access中指定一不是自動編號的欄位為自動編號欄位,也可以讓一自動編號欄位重新從指定值按指定步長自動編號。但是如果表中有資料,使用者不能用該語句來將該列的資料型別改變為COUNTER 資料型別。對於SQL Server並不支援。

對於SQL Server我們或許總希望用Alter Table 表名 Alter Column 你的欄位 IDENTITY(1,1)

來指定欄位重新從1開始計數,但是這句話本身是錯誤的,好長時間我也疑惑為什麼這句話不能執行。如果我們看看MS 對Alter Table語句的定義就清楚了,這句話根本是錯誤的。下面是MS對Alter Table語句的定義。

ALTERTABLEtable 
[ ALTER COLUMN column_name 
    { new_data_type [ ( precision [ , scale 
] ) ]
        
[ COLLATE < collation_name > 
]
        
[ NULL | NOT NULL ]
        
| {ADD|DROP } ROWGUIDCOL }
    ] 
    
|ADD
        { 
[ < column_definition > ]
        
| column_name AS computed_column_expression
        } 
[ ,]
    
|[ WITH CHECK | WITH NOCHECK ]ADD
        { 
< table_constraint > } [ ,] 
    
|DROP
        { 
[ CONSTRAINT ] constraint_name 
            
|COLUMNcolumn } [ ,] 
    
| { CHECK|NOCHECK } CONSTRAINT
        { 
ALL| constraint_name [ ,] }
    
| { ENABLE | DISABLE } TRIGGER
        { 
ALL| trigger_name [ ,] } 
}
< column_definition > ::=
    { column_name data_type }
    
[ [ DEFAULT constant_expression ][ WITH VALUES ]
    
|[ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
        ] 
    
[ ROWGUIDCOL ]
    
[ COLLATE < collation_name > ]
    
[ < column_constraint > ][ ]
< column_constraint > ::=
    
[ CONSTRAINT constraint_name ]
    { 
[ NULL | NOT NULL ]
        
|[ { PRIMARY KEY | UNIQUE }
            [ CLUSTERED | NONCLUSTERED 
]
            
[ WITH FILLFACTOR = fillfactor ]
            
[ ON { filegroup | DEFAULT } ]
            ] 
        
|[ [ FOREIGN KEY ]
            
REFERENCES ref_table [ ( ref_column ) ]
            
[ ON DELETE { CASCADE | NO ACTION } ]
            
[ ON UPDATE { CASCADE | NO ACTION } ]
            
[ NOT FOR REPLICATION ]
            ] 
        
|CHECK[ NOT FOR REPLICATION ]
            ( logical_expression ) 
    }
< table_constraint > ::=
    
[ CONSTRAINT constraint_name ]
    { 
[ { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED 
]
        { ( 
column[ ,] ) } 
        
[ WITH FILLFACTOR = fillfactor ]
        
[ ON { filegroup | DEFAULT } ]
        ] 
        
|FOREIGNKEY
            
[ ( column [ ,] ) ]
            
REFERENCES ref_table [ ( ref_column [ ,] ) ]
            
[ ON DELETE { CASCADE | NO ACTION } ]
            
[ ON UPDATE { CASCADE | NO ACTION } ]
            
[ NOT FOR REPLICATION ]
        
|DEFAULT constant_expression
            
[ FOR column ][ WITH VALUES ]
        
|CHECK[ NOT FOR REPLICATION ]
            ( search_conditions ) 
    }

可以看到,IDENTITY只是在< column_definition >中,也就是說,我們可以這樣使用

Alter Table 表名 Add 欄位名 Int IDENTITY(1,1)

即,我們可以增加一個欄位並指定它為自動編號欄位。但是不能更改一個欄位為自動編號欄位(也或許我沒找到方法)。即,如果我們想給表增加自動編號欄位,只能使用新增欄位的方法,而不能更改一個已有的欄位為自動編號欄位。

至於如果需要更改自動編號欄位計數起始值可以使用DBCC命令:

DBCC CHECKIDENT (表名,RESEED,100)

自動編號欄位下一個從101開始計。