https://docs.djangoproject.com/en/1.10/topics/migrations/
这里说: “PostgreSQL在模式支持方面是所有数据库中最强大的;唯一需要注意的是,添加具有默认值的列将导致表格的完全重写,与其大小成比例。
“出于这个原因,建议您始终使用 null = True 创建新列,因为这样会立即添加它们。”
我在问我是否正确。 根据我的理解,我应首先用 null = True 创建字段,然后没有默认值然后迁移它,然后给它一个默认值并再次迁移它,值会立即添加,但否则整个数据库将被重写,Django迁移本身不想做这个技巧吗?
答案 0 :(得分:2)
在同一页面中也提到:
此外,MySQL将完全重写几乎每个模式的表 操作并且通常需要与数量成比例的时间 表中的行以添加或删除列。在较慢的硬件上 可能比每百万行差一分钟 - 添加几列 只有几百万行的表格可以锁定您的网站 十分钟。
和
SQLite几乎没有内置的架构更改支持,等等 Django试图通过以下方式模仿它:
使用新架构创建新表复制数据 删除旧表重命名新表以匹配原始表 名称
简而言之,你所指的那句话真的是
postgresql在添加新列时表现出类似mysql的行为 默认值
您正在尝试的系统将起作用。添加带有null的列意味着不会重写表。然后,您可以将列更改为具有默认值。但是现有的空值将继续为空
答案 1 :(得分:1)
我理解它的方式,在第二次迁移时,默认值不会写入现有行。只有当创建一个没有默认字段值的新行时,才会写入它。
我认为对新列使用null = True的警告只与性能有关。如果您确实希望所有现有行都具有默认值,请使用default =并接受表重写的性能结果。