ALTER TABLE的用法 增加列、删除列、改列名、改列约束、改表名

ALTERTABLE
名称
ALTERTABLE—更改表属性
语法
ALTERTABLEtable[*]
ADD[COLUMN]columntype
ALTERTABLEtable[*]
ALTER[COLUMN]column{SETDEFAULTvalue|DROPDEFAULT}
ALTERTABLEtable[*]
RENAME
[COLUMN]columnTOnewcolumn
ALTERTABLEtable
RENAME
TOnewtable
ALTERTABLEtable
ADDtableconstraintdeFinition
Inputs
table
试图更改的现存表的名称
column
现存或新的列名称
type
新列的类型.
newcolumn
现存列的新名称
newtable
表的新名称
tableconstraintdeFinition
表的新的约束定义.
New
tableconstraintforthetable

输出
ALTER
从被更名的列或表返回的信息.
ERROR
如果一个列或表不存在返回的信息.
描述
ALTERTABLE变更一个现存表的定义.ADDCOLUMN形式用与CREATETABLE一样的语法向表中增加一个新列/字段。ALTERCOLUMN形式允许你从列/字段中设置或者删除缺省(值)。注意缺省(值)只对新插入的行有效。RENAME子句可以在不影响相关表中任何数据的情况下更改一个表或者列/字段的名称。因此,表或列/字段在此命令执行后仍将是相同尺寸和类型。ADDtableconstraintdeFinition子句用与CREATETABLE一样的语法向表中增加一个新的约束。

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

注意
COLUMN关键字是多余的,可以省略.
如果"
*"跟在一个表名后面,表示该命令要对该表和所有继承级别低于该表的表进行操作;缺省时,该属性(更改)不会增加到任何子表或修改任何子表的相关名称。当增加修改一个上级表(译注:继承级别高的表)的属性时总是应该这样的。否则,象下面这样的在继承级上进行的查询
SELECTNewColumnFROMSuperClass*
将不能工作,因为子表会比上级表少一个属性
在目前的实现里,新列
/字段的缺省(值)和约束子句会被忽略。你可以随后用ALTERTABLESETDEFAULT形式设置缺省(值)。(你还不得不用UPDATE把已存在行更新为缺省值。)

在目前的实现里,只有
FOREIGNKEY约束可以增加到表中.要创建或者删除一个唯一约束,可以创建一个唯一索引(参阅CREATEINDEX).要想增加check(检查)约束,你需要重建和重载该表,用的参数是CREATETABLE命令的其他参数.
修改表的结构,你必须是表的所有人。不允许更改系统表结构的任何部分。Postgresql用户手册里有关于继承的更多信息.

用法
向表中增加一个
VARCHAR列:
ALTERTABLEdistributorsADDCOLUMNaddressVARCHAR(30);
对现存列改名:
ALTERTABLEdistributorsRENAMECOLUMNaddressTOcity;
对现存表改名:
ALTERTABLEdistributorsRENAMETOsuppliers;
向表中增加一个外键约束:
ALTERTABLEdistributorsADDCONSTRAINTdistfkFOREIGNKEY(address)REFERENCESaddresses(address)MATCHFULL

兼容性
sql92ADD
COLUMN形式是兼容的,除了上面说的缺省(值)和约束外。ALTERCOLUMN形式是完全兼容的。
sql92对
ALTERTABLE声明了一些附加的Postgres目前还不直接支持功能
ALTERTABLEtableDROPCONSTRAINTconstraint{RESTRICT|CASCADE}
增加删除表的约束(比如象检查约束,唯一约束或外键约束)。要创建或删除一个唯一约束,对应地创建或删除一个唯一索引,要修改其他类型的约束,你需要重建和重载该表,使用 
CREATETABLE 命令的其他参数.
例如,删除distributors的任何约束:
CREATETABLEtempASSELECT*FROMdistributors;
DROPTABLEdistributors;
CREATETABLEdistributorsASSELECT*FROMtemp;
DROPTABLEtemp;
ALTERTABLEtableDROP[COLUMN]column{RESTRICT|CASCADE}
前,要删除一个现存的列,表必须重新创建和重新装载:
CREATETABLEtempASSELECTdid,cityFROMdistributors;
DROPTABLEdistributors;
CREATETABLEdistributors(
did
DECIMAL(3)DEFAULT1,
name
VARCHAR(40)NOTNULL,
);
INSERTINTOdistributorsSELECT*FROMtemp;
DROPTABLEtemp;
重命名
/字段和表名是Postgresql扩展。sql92没有提供这些。

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...