前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSQL基础(七):表的基本操作(一)

PostgreSQL基础(七):表的基本操作(一)

原创
作者头像
Lansonli
发布2024-09-22 08:01:49
700
发布2024-09-22 08:01:49
举报
文章被收录于专栏:Lansonli技术博客

表的基本操作(一)

表的构建语句,基本都会。

核心在于构建表时,要指定上一些约束。

一、约束

1、主键

代码语言:javascript
复制
-- 主键约束
drop table test;
create table test(
    id bigserial primary key ,
    name varchar(32)
);

2、非空

代码语言:javascript
复制
-- 非空约束
drop table test;
create table test(
    id bigserial primary key ,
    name varchar(32) not null
);

3、唯一

代码语言:javascript
复制
drop table test;
create table test(
    id bigserial primary key ,
    name varchar(32) not null,
    id_card varchar(32) unique
);
insert into test (name,id_card) values ('张三','333333333333333333');
insert into test (name,id_card) values ('李四','333333333333333333');
insert into test (name,id_card) values (NULL,'433333333333333333');

4、检查

代码语言:javascript
复制
-- 检查约束
-- 价格的表,price,discount_price
drop table test;
create table test(
    id bigserial primary key,
    name varchar(32) not null,
    price numeric check(price > 0),
    discount_price numeric check(discount_price > 0),
    check(price >= discount_price)
);
insert into test (name,price,discount_price) values ('粽子',122,12);

5、外键

目前国内很多公司不玩这个,坑比较多,最好不要玩,真需要可以查询文档。

6、默认值

一般公司内,要求表中除了主键和业务字段之外,必须要有5个字段

created,create_id,updated,update_id,is_delete

代码语言:javascript
复制
-- 默认值
create table test(
    id bigserial primary key,
    created timestamp default current_timestamp
);

二、触发器

触发器Trigger,是由事件出发的一种存储过程

当对标进行insert,update,delete,truncate操作时,会触发表的Trigger(看触发器的创建时指定的事件)

构建两张表,学生信息表,学生分数表。

在删除学生信息的同时,自动删除学生的分数。

先构建表信息,填充数据

代码语言:javascript
复制
create table student(
    id int,
    name varchar(32)
);
create table score(
    id int,
    student_id int,
    math_score numeric,
    english_score numeric,
    chinese_score numeric
);
insert into student (id,name) values (1,'张三');
insert into student (id,name) values (2,'李四');
insert into
    score
(id,student_id,math_score,english_score,chinese_score)
    values
(1,1,66,66,66);

insert into
    score
(id,student_id,math_score,english_score,chinese_score)
    values
(2,2,55,55,55);

select * from student;
select * from score;

为了完成级联删除的操作,需要编写pl/sql。

先查看一下PGSQL支持的plsql,查看一下PGSQL的plsql语法

代码语言:javascript
复制
[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];

构建一个存储函数,测试一下plsql

代码语言:javascript
复制
-- 优先玩一下plsql
-- $$可以理解为是一种特殊的单引号,避免你在declare,begin,end中使用单引号时,出现问题,
-- 需要在编写后,在$$之后添加上当前内容的语言。
create function test() returns int as $$
declare
    money int := 10;
begin
    return money;
end;
$$ language plpgsql;

select test();

在简单了解了一下plpgsql的语法后,编写一个触发器函数。

触发器函数允许使用一些特殊变量

NEW 数据类型是RECORD;该变量为行级触发器中的INSERT/UPDATE操作保持新数据行。在语句级别的触发器以及DELETE操作,这个变量是null。

OLD 数据类型是RECORD;该变量为行级触发器中的UPDATE/DELETE操作保持新数据行。在语句级别的触发器以及INSERT操作,这个变量是null。

构建一个删除学生分数的触发器函数。

代码语言:javascript
复制
-- 构建一个删除学生分数的触发器函数。
create function trigger_function_delete_student_score() returns trigger as $$
begin
    delete from score where student_id = old.id;
    return old;
end;
$$ language plpgsql;

开始构建触发器,在学生信息表删除时,执行前面声明的触发器函数

代码语言:javascript
复制
CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
    [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )

where event can be one of:

    INSERT
    UPDATE [ OF column_name [, ... ] ]
    DELETE
    TRUNCATE

CONSTRAINT选项被指定,这个命令会创建一个 约束触发器 。这和一个常规触发器相同,不过触发该触发器的时机可以使用SET CONSTRAINTS调整。约束触发器必须是表上的 AFTER ROW触发器。它们可以在导致触发器事件的语句末尾被引发或者在包含该语句的事务末尾被引发。在后一种情况中,它们被称作是被 延迟 。一个待处理的延迟触发器的引发也可以使用 SET CONSTRAINTS立即强制发生。当约束触发器实现的约束被违背时,约束触发器应该抛出一个异常。

代码语言:javascript
复制
-- 编写触发器,指定在删除某一行学生信息时,触发当前触发器,执行触发器函数
create trigger trigger_student 
after 
delete 
on student 
for each row 
execute function trigger_function_delete_student_score();
-- 测试效果
select * from student;
select * from score;
delete from student where id = 1;

三、表空间

在存储数据时,数据肯定要落到磁盘上,基于构建的tablespace,指定数据存放在磁盘上的物理地址。

如果没有自己设计tablespace,PGSQL会自动指定一个位置作为默认的存储点。

可以通过一个函数,查看表的物理数据存放在了哪个磁盘路径下。

代码语言:javascript
复制
-- 查询表存储的物理地址
select pg_relation_filepath('student');

这个位置是在$PG_DATA后的存放地址

代码语言:javascript
复制
$PG_DATA == /var/lib/pgsql/12/data/

41000其实就是存储数据的物理文件

构建表空间,指定数据存放位置

代码语言:javascript
复制
-- 构建表空间,构建表空间需要用户权限是超级管理员,其次需要指定的目录已经存在
create tablespace tp_test location '/var/lib/pgsql/12/tp_test';

构建数据库,以及表,指定到这个表空间中

其实指定表空间的存储位置后,PGSQL会在$PG_DATA目录下存储一份,同时在咱们构建tablespace时,指定的路径下也存储一份。

这两个绝对路径下的文件都有存储表中的数据信息。

代码语言:javascript
复制
/var/lib/pgsql/12/data/pg_tblspc/41015/PG_12_201909212/41016/41020
/var/lib/pgsql/12/lz_tp_test/PG_12_201909212/41016/41020

进一步会发现,其实在PGSQL的默认目录下,存储的是一个link,连接文件,类似一个快捷方式

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ​表的基本操作(一)
    • 一、约束
      • 1、主键
      • 2、非空
      • 3、唯一
      • 4、检查
      • 5、外键
      • 6、默认值
    • 二、触发器
      • 三、表空间
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档