如果您正在编写数据迁移脚本并希望更改列的某些方面,那么典型(并且看似唯一的)方法是编写ALTER TABLE CHANGE COLUMN ...
语句。但是,这需要您重新声明整个列定义。
我们过去曾遇到过一些版本问题。为了说明,假设我们有这个预先存在的表:
CREATE TABLE Book (id INT, type VARCHAR(25) DEFAULT 'Hardcover');
一个问题是有人写了一个迁移但是改变了一个字段的一个方面但忘了重新声明所有属性,如下所示:
ALTER TABLE Book CHANGE COLUMN type type VARCHAR(30);
-- Opps, just deleted the DEFAULT 'Hardcover' attribute
也存在这样的情况,即两次迁移相互冲突:
-- Bob and Joe both get the latest db schema
-- Joe checks in this migration to increase the char length from 25 to 50:
ALTER TABLE CHANGE COLUMN type type VARCHAR(50) DEFAULT 'Hardcover';
-- Without noticing Joe's change, Bob checks in this migration to add NOT NULL:
ALTER TABLE CHANGE COLUMN type type VARCHAR(25) DEFAULT 'Hardcover' NOT NULL;
-- Opps, Bob just clobberd Joe's change of char length
如果有一种方法可以修改字段的单个属性,例如它的数据类型,可空性,默认值,字符集等,而无需一次性重新声明所有内容,那将是理想的。在大多数情况下,这可以缓解上述两个问题。
我在想: