SQL Alter
SQL ALTER TABLE 语句
Section titled “SQL ALTER TABLE 语句”ALTER TABLE 语句
Section titled “ALTER TABLE 语句”ALTER TABLE 语句用于修改现有表的结构。这包括添加、删除或修改列(column),以及添加或删除约束(constraint)。
常见的 ALTER TABLE 操作:
- 添加新列
- 删除现有列
- 修改现有列的数据类型(data type)或属性(properties)(例如,大小、可空性(NULLability)、默认值(default value))
- 添加或删除约束(例如,PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK)
重要提示:修改表结构,尤其是在大型表上,可能是一项资源密集型操作,可能会锁定表,影响性能。通常建议在维护窗口期执行此类更改。
SQL ALTER TABLE 语法
Section titled “SQL ALTER TABLE 语法”ALTER TABLE 的具体语法在不同的数据库系统 (关系型数据库管理系统 RDBMS) 之间可能有所不同。下面是常见操作的常用语法。
1. 添加列
Section titled “1. 添加列”ALTER TABLE table_name ADD COLUMN column_name datatype [column_constraints];
示例:ALTER TABLE Employees ADD COLUMN HireDate DATE;
2. 删除列
Section titled “2. 删除列”ALTER TABLE table_name DROP COLUMN column_name;
注意:一些较老的数据库系统可能对删除列有限制,但大多数现代 RDBMS 都支持此操作。请谨慎操作,因为它会永久删除该列及其数据。
示例:ALTER TABLE Employees DROP COLUMN FaxNumber;
3. 修改列的数据类型或属性
Section titled “3. 修改列的数据类型或属性”此语法在 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);
4. 添加约束
Section titled “4. 添加约束”ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint_definition;
示例:ALTER TABLE Orders ADD CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);
5. 删除约束
Section titled “5. 删除约束”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;
SQL ALTER TABLE 示例
Section titled “SQL ALTER TABLE 示例”考虑一个初始的 “Persons” 表:
| PersonID | LastName | FirstName | Address | City |
|---|---|---|---|---|
| 1 | Hansen | Ola | Timoteivn 10 | Sandnes |
| 2 | Svendsen | Tove | Borgvn 23 | Sandnes |
| 3 | Pettersen | Kari | Storgt 20 | Stavanger |
示例 1:添加 ‘DateOfBirth’ 列
Section titled “示例 1:添加 ‘DateOfBirth’ 列”ALTER TABLE Persons ADD COLUMN DateOfBirth DATE NULL;
现在 “Persons” 表将变为这样(新列对于现有行最初为 NULL):
| PersonID | LastName | FirstName | Address | City | DateOfBirth |
|---|---|---|---|---|---|
| 1 | Hansen | Ola | Timoteivn 10 | Sandnes | NULL |
| 2 | Svendsen | Tove | Borgvn 23 | Sandnes | NULL |
| 3 | Pettersen | Kari | Storgt 20 | Stavanger | NULL |
要获取完整的数据类型参考,请查阅您特定 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 值,否则操作将失败。
示例 3:删除 ‘DateOfBirth’ 列
Section titled “示例 3:删除 ‘DateOfBirth’ 列”ALTER TABLE Persons DROP COLUMN DateOfBirth;
“Persons” 表将恢复到添加 ‘DateOfBirth’ 之前的结构。
ALTER TABLE 的最佳实践:
Section titled “ALTER TABLE 的最佳实践:”- **备份数据:**在进行结构更改之前,尤其是在生产环境(production environments)中,务必备份您的表或数据库。
- **在开发环境测试:**首先在开发(development)或测试(staging)环境中测试
ALTER TABLE语句。 - **维护窗口期:**在非高峰时段或计划的维护窗口期(maintenance windows)对大型表执行更改,以最大程度地减少对用户的影响。
- **理解影响:**了解更改可能对现有数据、应用程序、索引(indexes)和约束造成的影响。
- **一次只做一项更改:**虽然某些 RDBMS 允许在一个语句中执行多个更改,但通常更清晰和安全的方法是每次
ALTER TABLE语句只应用一项结构更改,特别是对于复杂的更改。