ALTER TABLE

ALTER TABLE

名称

ALTER TABLE — 更改表属性
ALTER TABLE table
    [ * ] ADD [ COLUMN ] column type
ALTER TABLE table
    [ * ] RENAME [ COLUMN ] column TO newcolumn
ALTER TABLE table
    RENAME TO newtable

输入

table
试图更改的表的名称.
column
现存或新的列名称.
type
新列的类型.
newcolumn
现存列的新名称.
newtable
现存表(译注:原文是column,错了)的新名称.

输出

ALTER
从被更名的列或表返回的信息.
NEW
追加列返回的信息.
ERROR
如果一个列或表不存在返回的信息.

描述

ALTER TABLE 变更一个现存表的定义.新的列和其类型是和用CREATE TABLE创建表时一样的风格声明的,而且其受到和用CREATE TABLE创建表时一样的限制.RENAME 语句可以在不对表中数据造成任何影响的情况下更改表名或列名.因此,此命令执行后表或列仍然是和原先一样的类型和尺寸.

如果要改变表的属性,你必须是表的所有者.

注意

COLUMN 关键字是多余的,可以省略.

如果“[*]” 跟在一个表名后面,表示该命令要对该表和所有继承级别低于该表(该表父表)的表进行操作.PostgreSQL U用户手册 里有关于继承的更多信息.

请参考 CREATE TABLE 部分获取更多合法参数的描述.

用法

向表中增加一个 VARCHAR 列:
    ALTER TABLE distributors ADD COLUMN address VARCHAR(30);
对现存列改名:
    ALTER TABLE distributors RENAME COLUMN address TO city;
对现存表改名:
    ALTER TABLE distributors RENAME TO suppliers;

兼容性

SQL92

ALTER TABLE/RENAME 是 Postgres 语言的扩展.

SQL92 对 ALTER TABLE 声明了一些附加的Postgres目前还不支持的功能 :

ALTER TABLE table ALTER [ COLUMN ] column
    SET DEFAULT default

ALTER TABLE table ALTER [ COLUMN ] column
    ADD [ CONSTRAINT constraint ] table-constraint
对表中指定列声明缺省值或约束. 请参考 CREATE TABLE 获取缺省值和约束语句的语法.如果已经有一个缺省值,它将被新值取代.如果原有约束存在,它们将和新约束用逻辑与(AND)共同使用.


当前,要向现存的列设置新的缺省值或约束,此表必须重建和重新装载:

CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors (
    did      DECIMAL(3) DEFAULT 1,
    name     VARCHAR(40) NOT NULL,
    city     VARCHAR(30)
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;
(译注:这里的 temp 表也有前面同样问题.)
ALTER TABLE table
    DROP DEFAULT default
ALTER TABLE table
    DROP CONSTRAINT constraint { RESTRICT | CASCADE }
上面两句将表中原有的缺省值或约束删除.如果声明了 RESTRICT ,那么只有无依赖性的约束可以被删除.如果声明了 CASCADE ,任何和依赖于此约束的约束都将被删除.


当前,要将表中某列原有的缺省值或约束删除,表必须重建和重新装载:

CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors AS SELECT * FROM temp;
DROP TABLE temp;
ALTER TABLE table
    DROP [ COLUMN ] column { RESTRICT | CASCADE }
上面语句将表中某列删除.如果声明了 RESTRICT,那么只有一个没有被别的列依赖的列可以被删除.如果声明了 CASCADE,那么所有依赖于该列的列都将被删除.


当前,要删除一个现存的列,表必须重新创建和重新装载:

CREATE TABLE temp AS SELECT did, city FROM distributors;    
DROP TABLE distributors;
CREATE TABLE distributors (
    did      DECIMAL(3)  DEFAULT 1,
    name     VARCHAR(40) NOT NULL,
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;

转载于:https://www.cnblogs.com/Fly-sky/archive/2010/11/08/1871749.html

### SQL `ALTER TABLE` 语法概述 SQL 中的 `ALTER TABLE` 是一种强大的命令,允许用户动态调整现有表的结构。以下是关于该语句的一些常见用途及其具体实现方法。 #### 添加新列到表中 当需要向现有的表中添加一列或多列时,可以使用如下语法: ```sql ALTER TABLE table_name ADD column_name data_type; ``` 例如,如果要在一个名为 `employees` 的表中新增加一个存储员工电话号码的字段,则可执行以下语句[^1]: ```sql ALTER TABLE employees ADD phone_number VARCHAR(15); ``` #### 删除已有列 移除不再使用的列可以通过下面的方式完成: ```sql ALTER TABLE table_name DROP COLUMN column_name; ``` 需要注意的是,在某些数据库管理系统(DBMS)中可能不支持直接删除列的操作;对于这类情况,应查阅对应系统的官方文档确认其特性[^4]。假设我们要从之前提到的 `employees` 表里去掉刚才加入的 `phone_number` 字段,那么相应的指令将是这样[^2]: ```sql ALTER TABLE employees DROP COLUMN phone_number; ``` #### 修改列定义 更新某列的数据类型或者属性也是可行的,不过不同 DBMS 对此功能的支持程度有所差异。通用形式如下所示: ```sql ALTER TABLE table_name MODIFY COLUMN column_name new_data_type; -- 或者在一些系统中可能是这样的写法 -- ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT default_value; ``` 举个例子来说,如果我们决定改变 `salary` 列使其能够容纳更大的数值范围,就可以这样做[^3]: ```sql ALTER TABLE employees MODIFY salary DECIMAL(10,2); -- MySQL 使用方式 -- OR -- ALTER TABLE employees ALTER COLUMN salary TYPE NUMERIC USING salary::NUMERIC; -- PostgreSQL 特定版本中的处理办法 ``` #### 更改表名或其他元数据信息 除了针对单个列的操作外,还可以对整个表格进行更名或者其他高层次上的变动。像重命名一张表就很简单明了: ```sql RENAME TABLE old_table_name TO new_table_name; ``` 而在特定环境下也存在通过 `ALTER TABLE` 来达到类似效果的情形,比如 Oracle 数据库里的做法就是如此. #### 移除约束条件 最后一点值得注意的内容涉及到了各种类型的限制规则——无论是主键、外键还是索引等等都可以被轻松地解除绑定关系。这里给出几个典型场景下的解决策略作为参考[^3]: - **删除外键** ```sql ALTER TABLE child_table DROP FOREIGN KEY fk_constraint_name; ``` - **撤销唯一性保障机制** ```sql ALTER TABLE sample_table DROP INDEX unique_index_name; ``` - **消除主键声明** ```sql ALTER TABLE main_table DROP PRIMARY KEY; ``` 以上便是围绕着 SQL `ALTER TABLE` 命令展开的一系列讨论与实例解析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值