[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
我们直接来看个示例把:
#开始建表
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):决定了谁可以查询或修改特定的数据库对象或数据。访问权限可以通过以下几种方式进行控制:
2. 插入权限(Insert Privileges):决定了谁可以向特定的表、视图或其他数据库对象中插入数据。插入权限可以通过以下几种方式进行控制:
3. 查询权限(Query Privileges):决定了谁可以查询特定的数据库对象或数据。查询权限可以通过以下几种方式进行控制:
4. 修改权限(Update Privileges):决定了谁可以修改特定的数据库对象或数据。修改权限可以通过以下几种方式进行控制:
5. 控制权限(Control Privileges):决定了谁可以对数据库对象进行更改,例如增加、删除、修改列或约束等。控制权限可以通过以下几种方式进行控制:
具体操作实例:
#创建一个叫做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支持以下的时间和日期类型:
我们直接上个示例:
#创建一个表,里面包含了很多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)
以下是一些比较常用的函数: