Skip to content

SQL Alter

ALTER TABLE 语句用于修改现有表的结构。这包括添加、删除或修改列(column),以及添加或删除约束(constraint)。

常见的 ALTER TABLE 操作:

  • 添加新列
  • 删除现有列
  • 修改现有列的数据类型(data type)或属性(properties)(例如,大小、可空性(NULLability)、默认值(default value))
  • 添加或删除约束(例如,PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK)

重要提示:修改表结构,尤其是在大型表上,可能是一项资源密集型操作,可能会锁定表,影响性能。通常建议在维护窗口期执行此类更改。

ALTER TABLE 的具体语法在不同的数据库系统 (关系型数据库管理系统 RDBMS) 之间可能有所不同。下面是常见操作的常用语法。

ALTER TABLE table_name ADD COLUMN column_name datatype [column_constraints];

示例:ALTER TABLE Employees ADD COLUMN HireDate DATE;

ALTER TABLE table_name DROP COLUMN column_name;

注意:一些较老的数据库系统可能对删除列有限制,但大多数现代 RDBMS 都支持此操作。请谨慎操作,因为它会永久删除该列及其数据。

示例:ALTER TABLE Employees DROP COLUMN FaxNumber;

此语法在 RDBMS 之间差异很大:

SQL Server / PostgreSQL:

ALTER TABLE table_name ALTER COLUMN column_name new_datatype [new_properties];

示例 (SQL Server):ALTER TABLE Products ALTER COLUMN ProductName VARCHAR(100) NOT NULL;

MySQL:

ALTER TABLE table_name MODIFY COLUMN column_name new_datatype [new_properties];

示例 (MySQL):ALTER TABLE Products MODIFY COLUMN ProductName VARCHAR(100) NOT NULL;

Oracle:

ALTER TABLE table_name MODIFY (column_name new_datatype [new_properties]);

示例 (Oracle):ALTER TABLE Products MODIFY (ProductName VARCHAR2(100 CHAR) NOT NULL);

ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint_definition;

示例:ALTER TABLE Orders ADD CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

注意:对于某些 RDBMS,如 MySQL,删除 FOREIGN KEY 可能需要 DROP FOREIGN KEY constraint_name。删除 PRIMARY KEY 可能需要 DROP PRIMARY KEY。

示例:ALTER TABLE Orders DROP CONSTRAINT FK_CustomerOrder;

考虑一个初始的 “Persons” 表:

PersonIDLastNameFirstNameAddressCity
1HansenOlaTimoteivn 10Sandnes
2SvendsenToveBorgvn 23Sandnes
3PettersenKariStorgt 20Stavanger

ALTER TABLE Persons ADD COLUMN DateOfBirth DATE NULL;

现在 “Persons” 表将变为这样(新列对于现有行最初为 NULL):

PersonIDLastNameFirstNameAddressCityDateOfBirth
1HansenOlaTimoteivn 10SandnesNULL
2SvendsenToveBorgvn 23SandnesNULL
3PettersenKariStorgt 20StavangerNULL

要获取完整的数据类型参考,请查阅您特定 RDBMS(例如 MS Access、MySQL、SQL Server、PostgreSQL、Oracle)的文档。常见的类型包括 VARCHAR(n)、INT、DECIMAL(p,s)、DATE、TIMESTAMP。

示例 2:更改 ‘Address’ 列的数据类型/属性 (MySQL 示例)

Section titled “示例 2:更改 ‘Address’ 列的数据类型/属性 (MySQL 示例)”

假设我们想增加 Address 列的长度并将其设置为 NOT NULL(假设它当前允许 NULL,并且我们已经更新了现有的 NULL 值)。

ALTER TABLE Persons MODIFY COLUMN Address VARCHAR(255) NOT NULL;

注意:将列更改为 NOT NULL 要求所有现有行在该列中都有非 NULL 值,否则操作将失败。

ALTER TABLE Persons DROP COLUMN DateOfBirth;

“Persons” 表将恢复到添加 ‘DateOfBirth’ 之前的结构。

  • **备份数据:**在进行结构更改之前,尤其是在生产环境(production environments)中,务必备份您的表或数据库。
  • **在开发环境测试:**首先在开发(development)或测试(staging)环境中测试 ALTER TABLE 语句。
  • **维护窗口期:**在非高峰时段或计划的维护窗口期(maintenance windows)对大型表执行更改,以最大程度地减少对用户的影响。
  • **理解影响:**了解更改可能对现有数据、应用程序、索引(indexes)和约束造成的影响。
  • **一次只做一项更改:**虽然某些 RDBMS 允许在一个语句中执行多个更改,但通常更清晰和安全的方法是每次 ALTER TABLE 语句只应用一项结构更改,特别是对于复杂的更改。