1

如果您正在编写数据迁移脚本并且想要更改列的某些方面,典型的(并且看似唯一的)方法是编写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

理想的情况是,如果有一种方法可以只修改字段的单个属性,例如它的数据类型、可空性、默认值、字符集等,而无需一次重新声明所有内容。在大多数情况下,这将缓解上述两个问题。

我也在想:

  1. 是否有仅修改列的一个方面/属性的语法?或者 ...
  2. SQL本身有没有办法读取列定义,修改一个方面然后重新声明它?
4

0 回答 0