postgresql 数据库 alter table alter column set not null 的一些实践
os: centos 7.4
db: postgresql 10.11
创建表后,有时需要对表进行 set not null 或者 drop not null 设置。
版本
# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
#
# su - postgres
$
$ psql -c "select version();"version
----------------------------------------------------------------------------------------------------------PostgreSQL 10.11 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 row)
create table
$ psql
psql (10.11)
Type "help" for help.postgres=#
postgres=# drop table if exists tmp_t4;
postgres=#
postgres=# create table tmp_t4(
id int8,
name varchar(100),
memo1 varchar(100),
memo2 varchar(100)
);postgres=#
postgres=# insert into tmp_t4
select id,md5(id::varchar),md5(id::varchar),null from generate_series(1,1000000) as id;postgres=# select * from tmp_t4 limit 5;id | name | memo1 | memo2
----+----------------------------------+----------------------------------+-------1 | c4ca4238a0b923820dcc509a6f75849b | c4ca4238a0b923820dcc509a6f75849b | 2 | c81e728d9d4c2f636f067f89cc14862c | c81e728d9d4c2f636f067f89cc14862c | 3 | eccbc87e4b5ce2fe28308fd9f2a7baf3 | eccbc87e4b5ce2fe28308fd9f2a7baf3 | 4 | a87ff679a2f3e71d9181a67b7542122c | a87ff679a2f3e71d9181a67b7542122c | 5 | e4da3b7fbbce2345d7772b0674a318d5 | e4da3b7fbbce2345d7772b0674a318d5 |
(5 rows)postgres=# \d+ tmp_t4Table "public.tmp_t4"Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+------------------------+-----------+----------+---------+----------+--------------+-------------id | bigint | | | | plain | | name | character varying(100) | | | | extended | | memo1 | character varying(100) | | | | extended | | memo2 | character varying(100) | | | | extended | | postgres=# select oid,relname,relfilenode,relkind,relfrozenxid
from pg_class pc where pc.relname='tmp_t4';oid | relname | relfilenode | relkind | relfrozenxid
--------+---------+-------------+---------+--------------123860 | tmp_t4 | 123860 | r | 406588
(1 row)
set not null
对列中不含null进行 set not null 设置
postgres=# \timing on
Timing is on.
postgres=# alter table tmp_t4 alter column memo1 set not null;
ALTER TABLE
Time: 425.849 mspostgres=# \d+ tmp_t4Table "public.tmp_t4"Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+------------------------+-----------+----------+---------+----------+--------------+-------------id | bigint | | | | plain | | name | character varying(100) | | | | extended | | memo1 | character varying(100) | | not null | | extended | | memo2 | character varying(100) | | | | extended | | postgres=# select oid,relname,relfilenode,relkind,relfrozenxid
from pg_class pc where pc.relname='tmp_t4';oid | relname | relfilenode | relkind | relfrozenxid
--------+---------+-------------+---------+--------------123860 | tmp_t4 | 123860 | r | 406588
(1 row)Time: 0.527 ms
对列中含null进行 set not null 设置
postgres=# alter table tmp_t4 alter column memo2 set not null;
ERROR: column "memo2" contains null values
Time: 0.648 ms
报错,不能设置,对 0.648ms有点费解,怎么能在这么短时间发现有null 值
postgres=# update tmp_t4 set memo2=memo1 where id between 1 and 1000000;
UPDATE 1000000
Time: 16211.450 ms (00:16.211)postgres=# update tmp_t4 set memo2=null where id between 1000000 and 1000000;
UPDATE 1
Time: 534.788 mspostgres=# alter table tmp_t4 alter column memo2 set not null;
ERROR: column "memo2" contains null values
Time: 72.370 ms
从时间上来看是要扫描数据列判断
drop not null
postgres=# alter table tmp_t4 alter column memo1 drop not null;
ALTER TABLE
Time: 319.677 ms
postgres=#
postgres=# alter table tmp_t4 alter column memo2 drop not null;
ALTER TABLE
Time: 82.202 ms
参考:
http://postgres.cn/docs/10/sql-altertable.html
postgresql 数据库 alter table alter column set not null 的一些实践相关推荐
- v$lock之alter table drop column与alter table set unused column区别系列五
背景 之前文章: http://blog.itpub.net/9240380/viewspace-1814709/,涉及过如何删除表的某列,本文我们讨论下不同的删除表列语法参数,持锁模式的不同,便 ...
- MySQL 新增字段(alter table add column),报错:Duplicate entry
问题 执行一个增加字段的DDL语句脚本时,报错,错误如下: Error 1062: Duplicate entry 'c51d3db8-59a5 2022-06-28 17:59:59' for ke ...
- postgresql 数据库 alter table alter column set default 的一些实践
os: centos 7.4 db: postgresql 10.11 创建表后,有时需要对表进行 set default 或者 drop default 设置. 版本 # cat /etc/cent ...
- alter table add column多个字段_SQL对表中字段的操作 alter
ALTER TABLE 语句用于在现有表中添加.删除或修改列. 注意不同的数据库的语句有所不一样 增加和删除都基本一致. 进行修改表中字段的时候注意: 本文主要介绍 sqlserver/mysql/o ...
- oracle drop column 多个,3000W记录,alter table drop column很慢
最初由 yzm2008 发布 [B]Alter table T set unused(COLUMN) 和 drop column有什么区别吗? [/B] SET UNUSED Clause Speci ...
- alter table add column多个字段_ElementUI表格el-table表头固定自适应高度解决方案
一.前言 ElementUI.iView都以相同的方式提供了表格组件表头固定的方法,即设置组件的height属性.表头固定很重要,就在于当表格数据项很多时,滚动条出现在表格组件内,而不是出现在表格组件 ...
- alter table add column多个字段_利用Python将多个excel合并到一个文件中
数据岗位的小伙伴可能经常会遇到这样一个问题:多个来源返回的数据怎么整合到一个文件中?手动经常会出错,下面介绍一种利用Python处理的方式: 前期准备: 1.多个excel需要进行数据整理,保证文件的 ...
- alter table add column多个字段_WordPress 在文章列表快速编辑中编辑自定义字段
在快速编辑中添加自定义字段,通常我们不需要在 WordPress 后台文章列表的"快速编辑"菜单中进行更改,但有的时候如果可以把常用的设置添加到"快速编辑"菜单 ...
- sql server 使用drop column 列名 删除列时报错,由于一个或多个对象访问此 列,ALTER TABLE DROP COLUMN stu_cou_num 失败
删除没有任何其他引用的列时,出现了错误 仔细看了下这个列,并没有什么特殊.如下图: 但其确实有个约束: 'DF__HIS_DRUG___ALL_I__04E4BC85' . 为什么有这个约束呢??? ...
最新文章
- v-html解析的相对地址img 显示不出来_人工智能专题作品解析——APPInventor安卓应用开发AI图像识别简单应用...
- Spark分析之Standalone运行过程分析
- ELK日志分析平台搭建全过程(自己做了测试,测试不完整因为原文章都是图片)
- CSS :before :after 伪类选择器
- springcloud~Eureka实例搭建
- 安装开源 ITIL 门户 iTOP
- linux upstart机制简介及封装应用
- vs能运行python吗_vs怎么运行python(vs能运行python吗)
- 羡慕,浙江大学的双 11 快递,全部由物流机器人配送
- Sharing A Powerful Tool For Calculate Code Lines
- 个性化推荐从入门到精通(附推荐产品经理修炼秘籍)
- PAT-BASIC-1003-我要通过!
- 虚拟环境安装python3
- 读书笔记之深入理解Java虚拟机
- ESP32使用DFROBOT通过MQTT服务器进行NFC读写
- 陀螺仪、加速计、磁力计等传感器汇总
- 黔江哪里可以学计算机,黔江有什么大学
- tc ebpf 实践
- One Drive 回收站文件太多时无法清空回收站解决办法
- 删除word中一段话的空格