[小問題筆記(十一)] SQL SERVER 將可空字段改為 NOT NULL不可為空的兩個方法


一個字段里面有一些數據是NULL是很討厭的,寫查詢麻煩不說,最重要的is null  或者is not null都是不能命中索引的,會導致全表掃描啊。

所以對於一個已經存在NULL的字段,有時間的話最好改造改造。

 

方法1、為字段添加默認值約束,更新現有NULL值。 此方法簡單粗暴,容易引起鎖,線上數據慎用。

-- 1、為現有字段添加默認值約束
alter table Employee ADD CONSTRAINT DF_Employee_CityID  default (0) for CityID

-- 2、更新現有NULL值
update Employee set CityID=0 where CityID is null

 

 

方法2、建一個臨時表,導入數據,然后修改臨時表表名。 

-- 1、建立一個字段不可為空的臨時表
CREATE
TABLE Tmp_Employee ( ID int NOT NULL,  CityID int NOT NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

-- 2、導入現有數據 IF EXISTS(SELECT * FROM Employee) EXEC('INSERT INTO Tmp_Employee (ID, CityID) SELECT ID, CityID FROM dbo.Employee WITH (HOLDLOCK TABLOCKX)')
-- 3、刪除原表
DROP
TABLE dbo.Address GO
-- 4、將臨時表重命名 EXECUTE sp_rename N'Tmp_Employee', N'Employee', 'OBJECT' GO

 

總結:種種教訓告訴我們,建表時候就應該都建成 NOT NULL !!!

BUT,萬事無絕對,比如使用SqlBulkCopy(C#)等批量導表方法時,如果源表數據包含空值,而目標表的字段是NOT NULL,即使刪除約束也不行,會報錯。特別注意。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM