[SQL系列] 从头开始学PostgreSQL 自增 权限和时间

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131841058上一篇介绍了事务,锁,子查询

事务有点像是原子操作,需要有完整性,要么全都完成了,要么全都没完成,事情不能只做一半。

锁主要两种,共享锁和排它锁,可读不可写以及不可读写,以及细粒度的行级锁。

子查询的话,其实就是嵌套的sql查询语句,和with有一定的相似。

这次我们来介绍点自增,权限和时间

自增

自增,顾名思义就是自动增长,会在新纪录插入表中生成一个唯一的数字。

我们插表的时候,总有一个id序号,这个一般设置为自增,可以显示有多少行,但是这个字段一般都不是我们插入的,否则我们不得了解下,上一次最后一行的id是多少,然后再增加上去,再插入?这时候,还是依靠postgres的关键字把。

PostgreSQL自增主要有三个范围:

smallserial 1-32767, 因为在磁盘中占据了2字节,所以就是2^16,因为一个字节是8位,用16位表示的最大范围就是32767

serial 1-2147483647,在磁盘中占据4字节,所以就是2^32

bigserial 1-9223372036854775801,在磁盘中占据8字节,所以就是2^64

我们直接来看个示例把:

sql 复制代码
#开始建表
CREATE TABLE biztest (  
 id SERIAL PRIMARY KEY,  
 name VARCHAR(255)  
);  

#插入数据
INSERT INTO biztest (name) VALUES ('张三'); 

testdb=# select * from biztest;
 id | name 
----+------
  1 | 张三
(1 row)

testdb=# INSERT INTO biztest (name) VALUES ('李四');  
INSERT 0 1
testdb=# select * from biztest;
 id | name 
----+------
  1 | 张三
  2 | 李四
(2 rows)

这边建了个表,并且在id字段上加上了serial标记,那么证明这个字段就是可以自增的。

可以看到我们插入数据的时候并没有插入id的值,但是id会随着自增上去。

权限

在创建数据库对象的时候都会分配一个所有者,数据库的对象只有它的所有者才能够修改删除,要是要允许其他的用户角色使用它,就必须设置权限。

权限主要有以下的几种类型:

  1. 访问权限(Access Privileges):决定了谁可以查询或修改特定的数据库对象或数据。访问权限可以通过以下几种方式进行控制:
  • SELECT 权限:允许用户查询特定的表、视图或其他数据库对象。
  • INSERT 权限:允许用户向特定的表、视图或其他数据库对象中插入数据。
  • UPDATE 权限:允许用户修改特定的表、视图或其他数据库对象中的数据。
  • DELETE 权限:允许用户从特定的表、视图或其他数据库对象中删除数据。
  1. 插入权限(Insert Privileges):决定了谁可以向特定的表、视图或其他数据库对象中插入数据。插入权限可以通过以下几种方式进行控制:
  • INSERT 权限:允许用户向特定的表、视图或其他数据库对象中插入数据。
  • SELECT 权限:允许用户查询特定的表、视图或其他数据库对象,以便为插入操作做准备。
  1. 查询权限(Query Privileges):决定了谁可以查询特定的数据库对象或数据。查询权限可以通过以下几种方式进行控制:
  • SELECT 权限:允许用户查询特定的表、视图或其他数据库对象。
  • JOIN 权限:允许用户执行连接操作,将一个表与另一个表或其他数据库对象进行连接。
  1. 修改权限(Update Privileges):决定了谁可以修改特定的数据库对象或数据。修改权限可以通过以下几种方式进行控制:
  • UPDATE 权限:允许用户修改特定的表、视图或其他数据库对象中的数据。
  • DELETE 权限:允许用户从特定的表、视图或其他数据库对象中删除数据。
  1. 控制权限(Control Privileges):决定了谁可以对数据库对象进行更改,例如增加、删除、修改列或约束等。控制权限可以通过以下几种方式进行控制:
  • ALTER 权限:允许用户对特定的表、视图或其他数据库对象进行更改,如添加、修改或删除列。
  • DROP 权限:允许用户删除特定的表、视图或其他数据库对象。

具体操作实例:

sql 复制代码
#创建一个叫做guest的角色
testdb=# create role guest;
CREATE ROLE


#授予这个角色students表的select权限
testdb=# grant select on students to guest;
GRANT

#授予sutends表的全部权限
testdb=# grant all on students to guest;
GRANT


#回收授权
testdb=# revoke all on students from guest;
REVOKE

#删除用户
testdb=# 
testdb=# drop user guest;
DROP ROLE
testdb=#

时间和日期

数据库中除了基础的几种类型,比较特殊的应该就是时间和日期了。PostgreSQL支持以下的时间和日期类型:

  1. 时间类型:PostgreSQL 支持多种时间类型,包括时间戳类型(如 timestamptz、timestamp 类型)和时间区间类型(如 interval 类型)。其中,timeSTAMPTZ 类型包含时区信息,而 timestamp 类型不含时区信息。interval 类型表示时间间隔,如分钟、小时、天、月、年等。
  2. 日期类型:PostgreSQL 支持日期类型,包括日期类型(如 date 类型)和日期时间类型(如 datetime 类型)。日期类型表示日期,而日期时间类型表示日期和时间。
  3. 时间和日期函数:PostgreSQL 提供了丰富的时间和日期函数,如取当前时间、取当前日期、取当前时间戳、计算时间差等。例如,可以使用 now() 函数获取当前时间,使用 current_date 函数获取当前日期,使用 epoch 函数获取当前时间戳。
  4. 时间和日期格式化:PostgreSQL 提供了时间和日期格式化函数,如 to_char() 函数、to_date() 函数、to_timestamp() 函数等。这些函数可以将时间和日期转换为不同的格式,如字符串、日期时间类型等。

我们直接上个示例:

sql 复制代码
#创建一个表,里面包含了很多timestamptz和date的日期用于示例

testdb=# create table teacher(
testdb(# id serial primary key,
testdb(# create_at timestamptz not null default now(),
testdb(# update_at timestamptz not null default now(),
testdb(# birthdate date not null
testdb(# );
CREATE TABLE

#我们插入一个date类型,timestamptz已经设定了default,就不插入了
testdb=# insert into teacher (birthdate) values (current_date);
INSERT 0 1


testdb=# select * from teacher;
 id |           create_at           |           update_at           | birthdate  
----+-------------------------------+-------------------------------+------------
  1 | 2023-07-21 14:05:51.588512+00 | 2023-07-21 14:05:51.588512+00 | 2023-07-21
(1 row)

以下是一些比较常用的函数:

  1. now():获取当前时间戳。
  2. current_date:获取当前日期。
  3. current_time:获取当前时间。
  4. epoch:获取当前时间戳(以秒为单位)。
  5. extract():从日期时间值中提取指定的时间单位(如年、月、日、小时、分钟等)。
  6. date_trunc():将日期时间值截断为指定的时间单位(如年、月、日、小时、分钟等)。
  7. date_add():将日期时间值添加或减去指定的时间单位(如年、月、日、小时、分钟等)。
  8. date_diff():计算两个日期时间值之间的时间差(以天、周、月、年等为单位)。
  9. date_format():将日期时间值格式化为指定的格式。
  10. date_parser():将字符串解析为日期时间值。
  11. time_add():将时间值添加或减去指定的时间单位(如小时、分钟等)。
  12. time_diff():计算两个时间值之间的时间差(以小时、分钟等为单位)。
  13. time_format():将时间值格式化为指定的格式。
  14. time_parser():将字符串解析为时间值。
  15. interval_add():将时间间隔值添加或减去指定的时间单位(如分钟、小时、天等)。
  16. interval_diff():计算两个时间间隔值之间的时间差(以指定的时间单位为单位)。
  17. interval_format():将时间间隔值格式化为指定的格式。
  18. interval_parser():将字符串解析为时间间隔值。
相关推荐
数据库小组6 小时前
2026 年,MySQL 到 SelectDB 同步为何更关注实时、可观测与可校验?
数据库·mysql·数据库管理工具·数据同步·ninedata·selectdb·迁移工具
华科易迅6 小时前
MybatisPlus增删改查操作
android·java·数据库
Kethy__6 小时前
计算机中级-数据库系统工程师-计算机体系结构与存储系统
大数据·数据库·数据库系统工程师·计算机中级
SHoM SSER6 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
熬夜的咕噜猫7 小时前
MySQL备份与恢复
数据库·oracle
jnrjian7 小时前
recover database using backup controlfile until cancel 假recover,真一致
数据库·oracle
lifewange7 小时前
java连接Mysql数据库
java·数据库·mysql
大妮哟8 小时前
postgresql数据库日志量异常原因排查
数据库·postgresql·oracle
还是做不到嘛\.9 小时前
Dvwa靶场-SQL Injection (Blind)-基于sqlmap
数据库·sql·web安全
不写八个9 小时前
PHP教程004:php链接mysql数据库
数据库·mysql·php