前端之家收集整理的这篇文章主要介绍了
PostgreSQL学习篇10.2 表,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以其他表创建新表:
postgres=# create table old(id int,id2 int,col1 int,constraint pk_old primary key(id,id2));
CREATE TABLE
postgres=# create table new (like old);
CREATE TABLE
postgres=# \d old
Table "public.old"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
id2 | integer | not null
col1 | integer |
Indexes:
"pk_old" PRIMARY KEY,btree (id,id2)
postgres=# \d new
Table "public.new"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
id2 | integer | not null
col1 | integer |
没有复制主键,如果想要连约束一起复制过来,那么需要使用including选项,可用的including选项:
including defaults
including constraints
including indexes
including storage
including comments
including all
postgres=# create table new2 (like old including all);
CREATE TABLE
postgres=# \d old
Table "public.old"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
id2 | integer | not null
col1 | integer |
Indexes:
"pk_old" PRIMARY KEY,id2)
postgres=# \d new2
Table "public.new2"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
id2 | integer | not null
col1 | integer |
Indexes:
"new2_pkey" PRIMARY KEY,id2)
postgres=#
熟悉的语法:
postgres=# create table new3 as select * from old with no data;
CREATE TABLE AS
postgres=# \d new3
Table "public.new3"
Column | Type | Modifiers
--------+---------+-----------
id | integer |
id2 | integer |
col1 | integer |
postgres=#
表的存储属性:
TOAST(The Oversized-Attribute Storage Technique)
postgres=# create table blog (id int,title text,content text);
CREATE TABLE
postgres=# \d+ blog
Table "public.blog"
Column | Type | Modifiers | Storage | Stats target | Description
---------+---------+-----------+----------+--------------+-------------
id | integer | | plain | |
title | text | | extended | |
content | text | | extended | |
postgres=# alter table blog alter content set storage external;
ALTER TABLE
postgres=# alter table blog alter title set storage main;
ALTER TABLE
postgres=# \d+ blog
Table "public.blog"
Column | Type | Modifiers | Storage | Stats target | Description
---------+---------+-----------+----------+--------------+-------------
id | integer | | plain | |
title | text | | main | |
content | text | | external | |
postgres=#
main:允许压缩,不允许行外存储。
external:允许行外存储,不允许压缩。
extended:允许压缩和行外存储。
plain:避免压缩或行外存储。
存储参数:fillfactor和toast.fillfactor,值为10到100,如设置fillfactor为60,则数据填充一个数据库到60%时就不再填充,剩余40%留作update用。如果表更新频繁,那么需要设置一个较小的fillfactor值。
临时表:
跟oracle一样,也分为会话级临时表和事务级临时表;与oracle不一样,完事后,没的不仅仅是数据,还有表。
会话级临时表:
postgres=# create temporary table test_tmp(id int,note text);
CREATE TABLE
postgres=# \d
List of relations
Schema | Name | Type | Owner
-----------+----------+-------+----------
pg_temp_2 | test_tmp | table | postgres
public | blog | table | postgres
public | new | table | postgres
public | new2 | table | postgres
public | new3 | table | postgres
public | old | table | postgres
public | t | table | postgres
public | testfun | table | postgres
public | testsz | table | postgres
public | tt | table | postgres
public | txt | table | postgres
(11 rows)
事务级临时表:
postgres=# create temporary table test_ttmp(id int,note text) on commit delete rows;
CREATE TABLE
postgres=# \d
List of relations
Schema | Name | Type | Owner
-----------+-----------+-------+----------
pg_temp_2 | test_tmp | table | postgres
pg_temp_2 | test_ttmp | table | postgres
public | blog | table | postgres
public | new | table | postgres
public | new2 | table | postgres
public | new3 | table | postgres
public | old | table | postgres
public | t | table | postgres
public | testfun | table | postgres
public | testsz | table | postgres
public | tt | table | postgres
public | txt | table | postgres
(12 rows)
postgres=#
postgres-# \q
[postgres@pg ~]$ psql
psql (9.6.1)
Type "help" for help.
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+---------+-------+----------
public | blog | table | postgres
public | new | table | postgres
public | new2 | table | postgres
public | new3 | table | postgres
public | old | table | postgres
public | t | table | postgres
public | testfun | table | postgres
public | testsz | table | postgres
public | tt | table | postgres
public | txt | table | postgres
(10 rows)
postgres=# 表结构都没有了。
增加非空约束:
alter table tab_name alter column col_name set not null;
删除非空约束:
alter table tab_name alter column col_name drop not null;
修改默认值:
alter table tab_name alter column col_name set default xxx;
删除默认值:
alter table tab_name alter column col_name drop default;
表继承:
很特别的技术。
postgres=# create table animal(name varchar(10),age int,sex boolean);
CREATE TABLE
postgres=# create table dog(leg int) inherits (animal);
CREATE TABLE
postgres=# \d animal
Table "public.animal"
Column | Type | Modifiers
--------+-----------------------+-----------
name | character varying(10) |
age | integer |
sex | boolean |
Number of child tables: 1 (Use \d+ to list them.)
postgres=# \d dog
Table "public.dog"
Column | Type | Modifiers
--------+-----------------------+-----------
name | character varying(10) |
age | integer |
sex | boolean |
leg | integer |
Inherits: animal
postgres=# select * from animal;
name | age | sex
------+-----+-----
(0 rows)
postgres=# select * from dog;
name | age | sex | leg
------+-----+-----+-----
(0 rows)
postgres=# insert into dog values('小花',11,true,4);
INSERT 0 1
postgres=# select * from animal;
name | age | sex
------+-----+-----
小花 | 11 | t
(1 row)
postgres=# select * from dog;
name | age | sex | leg
------+-----+-----+-----
小花 | 11 | t | 4
(1 row)
子表插入数据,父表能看到。
postgres=# insert into animal values('小花2',4);
ERROR: INSERT has more expressions than target columns
LINE 1: insert into animal values('小花2',4);
^
postgres=# insert into animal values('小花2',true);
INSERT 0 1
postgres=# select * from animal;
name | age | sex
-------+-----+-----
小花2 | 11 | t
小花 | 11 | t
(2 rows)
postgres=# select * from dog;
name | age | sex | leg
------+-----+-----+-----
小花 | 11 | t | 4
(1 row)
父表插入数据,字表却不行。
只查看父表的数据:
postgres=# select * from only animal;
name | age | sex
-------+-----+-----
小花2 | 11 | t
(1 row)
所有父表的检查约束和非空约束都会自动被所有子表继承。不过其他类型的约束(唯一、主键、外键)则不会被继承。
分区表:
PG是通过表继承来实现分区表的。表分区就是把逻辑上的一个大表分割成物理上的几个小块。
表的大小超过了数据库服务器的物理内存大小则应该使用分区表。
在使用继承实现的分区表时,一般会让父表为空,数据都存储在子表中。
确保postgre.conf里的配置参数constraint_exclusion是打开的。打开后,如果查询中where子句的过滤条件与分区的约束条件匹配,那么这个查询会智能的只查询这个分区,而不会查询其他分区。
postgres=# create table student(class int,name varchar(10),sex char(1));
CREATE TABLE
postgres=#
postgres=# create table student_class1(check (class=1)) inherits (student);
CREATE TABLE
postgres=# create table student_class2(check (class=2)) inherits (student);
CREATE TABLE
postgres=# create table student_class3(check (class=3)) inherits (student);
CREATE TABLE
postgres=#
postgres=# --创建触发器
postgres=# create or replace function student_insert_trigger()
postgres-# returns trigger as $$
postgres$# begin
postgres$# if(new.class=1) then
postgres$# insert into student_class1 values (new.*);
postgres$# elsif (new.class=2) then
postgres$# insert into student_class2 values (new.*);
postgres$# elsif (new.class=3) then
postgres$# insert into student_class3 values (new.*);
postgres$# else
postgres$# raise exception 'no class found.fix the student_insert_trigger function!';
postgres$# end if;
postgres$# return null;
postgres$# end;
postgres$# $$
postgres-# language plpgsql;
CREATE FUNCTION
postgres=# create trigger insert_student_class_trigger
postgres-# before insert on student
postgres-# for each row execute procedure student_insert_trigger();
CREATE TRIGGER
postgres=# \d student
Table "public.student"
Column | Type | Modifiers
--------+-----------------------+-----------
class | integer |
name | character varying(10) |
sex | character(1) |
Triggers:
insert_student_class_trigger BEFORE INSERT ON student FOR EACH ROW EXECUTE PROCEDURE student_insert_trigger()
Number of child tables: 3 (Use \d+ to list them.)
postgres=#
postgres=# insert into student values(1,'lm','n');
INSERT 0 0
postgres=# select * from student;
class | name | sex
-------+------+-----
1 | lm | n
(1 row)
postgres=# select * from student_class1;
class | name | sex
-------+------+-----
1 | lm | n
(1 row)
postgres=# select * from student_class2;
class | name | sex
-------+------+-----
(0 rows)
postgres=# select * from student_class3;
class | name | sex
-------+------+-----
(0 rows)
postgres=#
postgres=# show constraint_exclusion;
constraint_exclusion
----------------------
partition
(1 row)