我有一个表,它将文件数据保存在varbinary(max)列中,并且在将其转换为使用FILESTREAM列的中间位置,以便将数据保存在文件系统中。
作为其中的一部分,我有一个SQL更新脚本,它添加了新的FILESTREAM列:
ALTER TABLE [dbo].[File] ADD [Data] VARBINARY(MAX) FILESTREAM NULL
然后我将旧文件数据迁移到新的数据列。这会将文件数据保存到磁盘,其大小例如为20GB。
然后我改变了列,使其不为空
ALTER TABLE [dbo].[File] ALTER COLUMN [Data] VARBINARY(MAX) FILESTREAM NOT NULL
但是这会在磁盘上创建一个新的文件流数据副本(在文件组位置的新文件夹中),留下另外20GB的副本。
我很好奇为什么改变列的行为不为null重复数据?它是有意义的,如果它是一个新列,因此数据被复制,但其他一切保持不变,只是复制现有数据没有意义 - 更不用说这样做20GB的文件所需的时间。
我可以更改列添加以具有默认值,这不会导致重复:
ALTER TABLE [dbo].[File] ADD [Data] VARBINARY(MAX) FILESTREAM NOT NULL DEFAULT(0x0)
然后
ALTER TABLE [dbo].[File] ADD [Data] VARBINARY(MAX) FILESTREAM NOT NULL
但我很好奇为什么会这样。