SQL語(yǔ)句實(shí)現(xiàn)取消自增列屬性
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、橋東網(wǎng)站維護(hù)、網(wǎng)站推廣。
由于在SQL-SERVER中,自增列屬性不能直接修改,但可以通過以下方式變向?qū)崿F(xiàn)
1、如果僅僅是指定值插入,可用以下語(yǔ)句,臨時(shí)取消
SET IDENTITY_INSERT TableName ON
INSERT INTO tableName(xx,xx) values(xx,xx)
SET IDENTITY_INSERT TableName OFF
2、新增一列,刪除自增列,修改改列名
alter table a add xxx int
update a set xxx=id
alter table a drop column id
exec sp_rename 'xxx', 'id', 'column'
3、通過修改系統(tǒng)關(guān)于該表的列屬性,該方法使用不當(dāng)將可能引起其它不可預(yù)料的錯(cuò)誤
sp_configure 'allow update',1
reconfigure with override
go
update syscolumns set colstat=0 where colstat=1 and id=object_id('tablename')
go
sp_configure 'allow update',0
reconfigure with override
接分啦
創(chuàng)建表時(shí)指定自動(dòng)編號(hào)的字段
1.CREATE TABLE [dbo].[UserInfor]( [UserID] [int] IDENTITY(100,2) NOT NULL, [UserName] [nchar](10) NOT NULL, ) 說(shuō)明:創(chuàng)建一個(gè)用戶信息表UserInfor,并指定UserID為自動(dòng)編號(hào)字段。
其中:IDENTITY(100,2)表示字段的初始值為100,每次增量為2,如輸入數(shù)據(jù)后第一次為100,第二次為102。
2.獲取自動(dòng)編號(hào)的字段值
這里可以使用@@IDENTITY取得自動(dòng)增加字段主鍵的值
轉(zhuǎn):
SQL Server有三種不同的函數(shù)可以用來(lái)獲得含有標(biāo)識(shí)列的表里最后生成的標(biāo)識(shí)值:
@@IDENTITY
SCOPE_IDENTITY()
IDENT_CURRENT('數(shù)據(jù)表名')
以上三個(gè)函數(shù)雖然都可以返回?cái)?shù)據(jù)庫(kù)引擎最后生成插入標(biāo)識(shí)列的值,但是根據(jù)插入行的來(lái)源(例如:存儲(chǔ)過程或觸發(fā)器)以及插入該行的連接不同,這三個(gè)函數(shù)在功能上也有所不同。
@@IDENTITY函數(shù)可以返回所有范圍內(nèi)當(dāng)前連接插入最后所生成的標(biāo)識(shí)值(包括任何調(diào)用的存儲(chǔ)過程和觸發(fā)器)。這個(gè)函數(shù)不止可以適用于表。函數(shù)返回的值是最后表插入行生成的標(biāo)識(shí)值。
SCOPE_IDENTITY()函數(shù)跟上一個(gè)函數(shù)幾乎是一摸一樣的,不同的地方:即前者返回的值只限于當(dāng)前范圍(即執(zhí)行中的存儲(chǔ)過程)。
最后是IDENT_CURRENT函數(shù),它可以用于所有范圍和所有連接,獲得最后生成的表標(biāo)識(shí)值。跟前面兩個(gè)函數(shù)不同的是,這個(gè)函數(shù)只用于表,并且使用[數(shù)據(jù)表名]作為一個(gè)參數(shù)。
我們可以舉實(shí)例來(lái)演示上述函數(shù)是如何運(yùn)作的。
首先,我們創(chuàng)建兩個(gè)簡(jiǎn)單的例表:一個(gè)代表客戶表,一個(gè)代表審計(jì)表。創(chuàng)建審計(jì)表的目的是為了跟蹤數(shù)據(jù)庫(kù)里插入和刪除信息的所有記錄。
以下是引用片段:
CREATE TABLE dbo.customer
(customerid INT IDENTITY(1,1) PRIMARY KEY)
GO
CREATE TABLE dbo.auditlog
(auditlogid INT IDENTITY(1,1) PRIMARY KEY,
customerid INT, action CHAR(1),
changedate datetime DEFAULT GETDATE())
GO
然后,我們還要?jiǎng)?chuàng)建一個(gè)存儲(chǔ)過程和一個(gè)輔助觸發(fā)器,這個(gè)存儲(chǔ)過程將在數(shù)據(jù)庫(kù)表里插入新的客戶行,并返回生成的標(biāo)識(shí)值,而觸發(fā)器則會(huì)向?qū)徲?jì)表插入行:
以下是引用片段:
CREATE PROCEDURE dbo.p_InsertCustomer @customerid INT output
AS
SET nocount ON
INSERT INTO dbo.customer DEFAULT VALUES
SELECT @customerid = @@identity
GO
CREATE TRIGGER dbo.tr_customer_log ON dbo.customer
FOR INSERT, DELETE
AS
IF EXISTS (SELECT 'x' FROM inserted)
INSERT INTO dbo.auditlog (customerid, action)
SELECT customerid, 'I'
FROM inserted
ELSE
IF EXISTS (SELECT 'x' FROM deleted)
INSERT INTO dbo.auditlog (customerid, action)
SELECT customerid, 'D'
FROM deleted
GO
現(xiàn)在我們可以執(zhí)行程序,創(chuàng)建客戶表的第一行了:
以下是引用片段:
DECLARE @customerid INT
EXEC dbo.p_InsertCustomer @customerid output
SELECT @customerid AS customerid
執(zhí)行后返回了我們需要的第一個(gè)客戶的值,并記錄了插入審計(jì)表的條目。到目前為止,數(shù)據(jù)顯示沒有任何問題。
假設(shè)由于先前溝通出現(xiàn)了偏差,一個(gè)客戶服務(wù)代表現(xiàn)在需要從數(shù)據(jù)庫(kù)里刪除掉這個(gè)新增的客戶。我們現(xiàn)在就來(lái)把新插入的客戶行刪除掉:
以下是引用片段:
DELETE FROM dbo.customer WHERE customerid = 1
現(xiàn)在,客戶工作表為空表,而審計(jì)工作表里則有兩行——第一行是記錄第一次插入行,第二行是記錄刪除客戶記錄。
現(xiàn)在我們?cè)偻鶖?shù)據(jù)庫(kù)里增加第二個(gè)客戶信息并檢測(cè)一下獲得的標(biāo)識(shí)值:
以下是引用片段:
DECLARE @customerid INT
EXEC dbo.p_InsertCustomer @customerid output
SELECT @customerid AS customerid
哇!看看出現(xiàn)了什么情況!如果我們現(xiàn)在再看客戶工作表,就會(huì)發(fā)現(xiàn)雖然創(chuàng)建了客戶2,但是我們的程序返回的標(biāo)識(shí)值為3!到底出了什么問題呢?回想一下,前面講過@@IDENTITY函數(shù)的作用范圍,它會(huì)返回主程序調(diào)用的任何存儲(chǔ)過程或觸動(dòng)任何觸發(fā)器最后生成的標(biāo)識(shí)值,取決于哪一個(gè)在函數(shù)被調(diào)用前最后生成標(biāo)識(shí)值。在我們的例子里,初始范圍是p_InsertCustomer,然后是觸發(fā)器用來(lái)記錄插入條目的tr_customer_log。因此我們返回獲得的標(biāo)識(shí)值是審計(jì)工作表里觸發(fā)器插入生成的標(biāo)識(shí)值,而不是我們想要的客戶工作表里的生成的標(biāo)識(shí)值。
在SQL Server 2000之前的版本,@@IDENTITY函數(shù)是獲得標(biāo)識(shí)值的唯一方法。由于會(huì)出現(xiàn)這樣的存儲(chǔ)過程/觸發(fā)器問題,SQL Server開發(fā)團(tuán)隊(duì)在SQL Server 2000中引入了 SCOPE_IDENTITY()和IDENT_CURRENT這兩個(gè)函數(shù)來(lái)解決這個(gè)問題。所以在舊的SQL Server版本里,要解決這個(gè)問題比較麻煩。如果是SQL Server6.5版本,我建議可以去掉標(biāo)識(shí)列,然后創(chuàng)建一個(gè)可以包含下一個(gè)需要使用的值的輔助表,可以達(dá)到標(biāo)識(shí)列的作用效果。不過這個(gè)辦法也不是什么高明的辦法。
現(xiàn)在我們來(lái)修改一下存儲(chǔ)過程來(lái)使用SCOPE_IDENTITY()函數(shù),并重新執(zhí)行程序來(lái)添加第三個(gè)客戶條目:
以下是引用片段:
ALTER PROCEDURE dbo.p_InsertCustomer @customerid INT output
AS
SET nocount ON
INSERT INTO dbo.customer DEFAULT VALUES
SELECT @customerid = SCOPE_IDENTITY()
GO
DECLARE @customerid INT
EXEC dbo.p_InsertCustomer @customerid output
SELECT @customerid AS customerid
我們返回的標(biāo)識(shí)值還是3,不過這次我們獲得的標(biāo)識(shí)值是正確的,因?yàn)槲覀兲砑恿说谌齻€(gè)客戶條目。如果我們檢查一下審計(jì)工作表,就會(huì)發(fā)現(xiàn)里面已經(jīng)有第四個(gè)條目記錄新插入的客戶記錄。由于函數(shù)SCOPE_IDENTITY()只作用于當(dāng)前范圍,只返回當(dāng)前執(zhí)行程序的值,這樣就避免了發(fā)生剛才那樣的問題。
前面講過,函數(shù)@@IDENTITY和函數(shù)SCOPE_IDENTITY()不止用于表,不像函數(shù)IDENT_CURRENT那樣可以用表作為參數(shù)。使用@@IDENTITY和SCOPE_IDENTITY()這兩個(gè)函數(shù)的話在設(shè)置代碼時(shí)需要加倍小心,才能夠從所需要的表里獲得正確的標(biāo)識(shí)值。從表面上來(lái)看,放棄這兩個(gè)函數(shù),只使用函數(shù)IDENT_CURRENT并指定表是更安全的辦法。這樣可以避免出現(xiàn)獲得錯(cuò)誤標(biāo)識(shí)值的情況,對(duì)吧?記得先前說(shuō)過函數(shù)IDENT_CURRENT不僅會(huì)跨范圍,而且它還會(huì)跨連接。也就是說(shuō),使用這個(gè)函數(shù)生成的值不僅僅限于你的連接所執(zhí)行的程序,它的涵蓋范圍還包括整個(gè)數(shù)據(jù)庫(kù)所有的連接。因此,即使是在規(guī)模較小的OLTP環(huán)境里,它也會(huì)出現(xiàn)不能準(zhǔn)確返回所需值的問題。這樣就可能發(fā)生類似前面@@IDENTITY函數(shù)/觸發(fā)器的數(shù)據(jù)損壞問題。
我的建議是函數(shù)SCOPE_IDENTITY()是三個(gè)函數(shù)里最安全的函數(shù),應(yīng)該設(shè)置為默認(rèn)函數(shù)。使用這個(gè)函數(shù),你可以放心地添加觸發(fā)器和次存儲(chǔ)過程,無(wú)需擔(dān)心意外損壞數(shù)據(jù)。而另外兩個(gè)函數(shù)可以保留應(yīng)付特殊的情況,當(dāng)遇到需要使用這兩個(gè)函數(shù)的特殊情況時(shí),建議記錄它們的使用情況并進(jìn)行測(cè)試。
小技巧:
Sql Server 判斷表是存在標(biāo)識(shí)列
If Exists(Select * from SysColumns Where ID=OBJECT_ID(N'TEST1') And COLUMNPROPERTY(ID,Name,'IsIdentity')=1)
Print N'有自增列'
Else
Print N'沒有自增列'
Sql Server 顯示當(dāng)前數(shù)據(jù)庫(kù)包含自增列的表
Select b.name,a.* from SysColumns a,sysobjects b Where a.id=b.id and COLUMNPROPERTY(a.ID,a.Name,'IsIdentity')=1
UserID改成標(biāo)識(shí)規(guī)范 為 是 的時(shí)候,在你添加、刪除和修改用戶的時(shí)候都不能對(duì)Userid操作,而且它是自動(dòng)添加的,不可以修改。這樣數(shù)據(jù)庫(kù)表你不設(shè)置主鍵也可以。
如果UserID改成標(biāo)識(shí)規(guī)范 為 否 的時(shí)候,那么在增加、修改的時(shí)候你就得操作。
我用的ASP連接SQL Server 之后,先是登陸進(jìn)去,然后里面有個(gè)功能是 管理登陸賬戶。
我admin 表里面一共有 UserID, username,password, purview 四個(gè)欄目,其中UserID是主鍵, 當(dāng)我把UserID改成標(biāo)識(shí)規(guī)范 為 是 的時(shí)候, 登陸的時(shí)候總是顯示賬戶密碼錯(cuò)誤,登陸不進(jìn)去,改成否的時(shí)候到時(shí)可以登陸進(jìn)去了,但是后面的添加賬戶,顯示UserID不能為空。
在你下邊的代碼中
set rs=server.CreateObject("Adodb.recordset")
sql="insert into Admin(username,password,purview) values ------在添加數(shù)據(jù)時(shí),userid你沒有添加,這就說(shuō)明userid是標(biāo)識(shí)規(guī)范,否則就回出現(xiàn)錯(cuò)誤。
網(wǎng)頁(yè)題目:sqlserver將標(biāo)識(shí),sql server標(biāo)識(shí)符命名規(guī)則
文章出自:http://jinyejixie.com/article44/dsseche.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、ChatGPT、自適應(yīng)網(wǎng)站、Google、移動(dòng)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)