一個字段里面有一些數據是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,即使刪除約束也不行,會報錯。特別注意。