我想更改一个有大约400万记录的表中的字段。我确保所有这些字段值都不是NULL,并希望将此字段更改为NOT NULL。
ALTER TABLE dbo.MyTable
ALTER COLUMN myColumn int NOT NULL
更新这个似乎需要很长时间。是否有加速的方法或者只能在非工作时间隔夜进行?
这样做会引起表锁吗?
我想更改一个有大约400万记录的表中的字段。我确保所有这些字段值都不是NULL,并希望将此字段更改为NOT NULL。
ALTER TABLE dbo.MyTable
ALTER COLUMN myColumn int NOT NULL
更新这个似乎需要很长时间。是否有加速的方法或者只能在非工作时间隔夜进行?
这样做会引起表锁吗?
CREATE TABLE Test
(
T0 INT Not NULL,
T1 INT NUll
)
INSERT INTO Test VALUES(1, NULL) -- Works!
ALTER TABLE Test
WITH NOCHECK
ADD CONSTRAINT N_null_test CHECK (T1 IS NOT NULL)
ALTER COLUMN T1 int NOT NULL
INSERT INTO Test VALUES(1, NULL) -- Doesn't work now!
实际上,你有两个选择(添加了第三个选项,请参见编辑):
根据你的具体情况,任何一个选项都可能更好。我不会选择第二个选项,因为你必须在非工作时间运行它。从长远来看,你在半夜更新的时间将花费得很值,而相比节省几个小时可能面临的头疼问题,这是一种捷径。
话虽如此,如果你要选择第二个选项,你可以最小化非工作时间所需的工作量。由于你必须确保在修改列之前将行更新为非空,所以你可以编写一个游标来慢慢地(相对于一次性完成)进行更新。
使用sp_rename的链接。
NULL
值,所以不确定您答案的第二部分的相关性? - Martin Smith抱歉让您失望,但:
虽然与您无直接关系(因为它涉及从NOT NULL到NULL的转换),但这是一个有趣的阅读话题:http://beyondrelational.com/blogs/sankarreddy/archive/2011/04/05/is-alter-table-alter-column-not-null-to-null-always-expensive.aspx
最后提供一些古老的历史 - 在2005年论坛上的一个类似问题中,与@Kevin提供的建议相同 - 使用约束而不是将列本身设置为非空:http://www.sqlteam.com/Forums/topic.asp?TOPIC_ID=50671
Sch-M
锁基本上与所有操作都不兼容。然后,它必须读取每个页面以确定所有行是否有效。 - Martin Smith