加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL修改表

发布时间:2020-12-13 17:22:34 所属栏目:百科 来源:网络整理
导读:在pgsql里面进行表的修改使用的命令是alter table。 先创建一个实验表: CREATETABLEusers(uidserialNOTNULL,usernamecharactervarying(40),emailcharactervarying(100),passwordcharactervarying(33),ageinteger,CONSTRAINTusers_pkeyPRIMARYKEY(uid)); 先

在pgsql里面进行表的修改使用的命令是alter table。

先创建一个实验表:

CREATETABLEusers
(
uidserialNOTNULL,usernamecharactervarying(40),emailcharactervarying(100),passwordcharactervarying(33),ageinteger,CONSTRAINTusers_pkeyPRIMARYKEY(uid)
);

先定义一个枚举类型:

CREATETYPEgender_typeASENUM('男','女','未知');

添加字段:

altertableusersaddcolumngendersgender_typedefault'男';

上面这段SQL里面设置了一个默认值,如果你不设置默认值系统会默认为空。

你可以在添加字段的时候给这个字段设置一个约束,例如设置为 检查约束( 是否为空)

altertableusersaddcolumngenders_scharactervarying(10)check(genders_s<>'');

删除字段

同样的以上面那个表为例子:

altertableusersdropcolumngenders_s;

值得注意的是修改表与字段结构的时候是使用drop而不是delete.如果删除的字段作为其他表的外键,例如上面的genders_s作为其他表的外键,那么是不能通过上面表删除的。会提示错误:

ERROR: cannot drop table a column b because other objects depend on it

SQL 状态: 2BP01

详细:constraint c_b_fkey on table c depends on table a column b

指导建议:Use DROP ... CASCADE to drop the dependent objects too.

如果要强制删除则需要在后面加上 cascade(级联),这样所有的都会删除,包括其他表的;

altertableusersdropcolumngenders_scascade;

添加约束

同样的以上面的表为例子:

altertableusersaltercolumnemailsetnotnull;

给users表的email添加非空约束,这是一个字段约束。

如果是添加一个表约束就不能像上面这样写,例如给email设置一个唯一约束:

altertableusersaddconstraintemail_ununique(email);

如果是给另外一个表添加一个users_id外键:

altertablecaddforeignkey(a)referencesusers(uid);

上面是给c表的b字段设置一个外键,引用users表的uid

移除约束

移除约束必须得先知道约束的名字是什么,如果之前添加约束的时候没有指定约束名,则需要使用psql去查询数据库看系统给这个约束分配了什么约束名,例如查看表users的约束:

dusers

譬如删除email 的唯一约束:

altertableusersdropconstraintemail_un;

如果是写在存储函数或者是触发器里面使用$1代表表名,$2代表约束名的时候,需要打上引号:

altertable"$1"dropconstraint"$2";

如果需要删除这个这段的所有约束,包括其他表的引用外键。则需要加上cascade:

altertableusersdropconstraintemail_uncascade;

如果你只想删除众多约束中的一个,譬如非空约束不想要了:

altertableusersaltercolumnemaildropnotnull;

删除某个字段的约束则需要添加alter column,如果是修改表约束则不需要直接更语句即可

修改字段默认值

以users表为例子,给email设置一个默认值:

altertableusersaltercolumnemailsetdefault'test@gmail.com';

相反的,有添加就有移除:

altertableusersaltercolumnemaildropdefault;

执行之后是不会删除之前的数据设置的默认值,只是后面添加的默认值就没有了。

修改字段数据类型

修改字段数据类型的命令和修改字段默认值/约束语法类似:

altertableusersaltercolumnemailtypetext;

修改字段类型之后,原有的的数据类型会被转换成新的类型,这是一个非常耗CPU的事情。

字段重命名

altertableusersrenamecolumnemailtoemails;

字段重命名与修改字段是一样的语法形式:alter table...rename column ...to ...

表重命名

altertableusersrenametouser;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读