key words
postgresql pgsql
info
PostgreSQL: Documentation: 17: 1. What Is PostgreSQL?
MySQL VS PostgreSQL
##
-- show databases
SELECT datname FROM pg_database WHERE datistemplate = false;
SELECT
datname AS "Database Name",
pg_catalog.pg_get_userbyid(datdba) AS "Owner",
encoding,
datcollate AS "Collation",
datctype AS "Character Type",
datistemplate AS "Is Template"
FROM pg_database
WHERE datistemplate = false;CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL
);-- 修改序列的值
SELECT setval('extra_metric_docker_stats_id_seq1', 150000, true);
'extra_metric_docker_stats_id_seq1':你要操作的序列名称。
150000:你希望设置的当前值。
true:表示下一个 nextval 会返回 150001;如果是 false,则下一个 nextval 返回 150000。脚本
查看表所占硬盘空间
SELECT
c.relname AS "表名",
pg_size_pretty(pg_relation_size(c.oid)) AS "表数据大小",
pg_size_pretty(pg_indexes_size(c.oid)) AS "索引大小",
pg_size_pretty(COALESCE(pg_total_relation_size(t.oid), 0)) AS "TOAST大小",
pg_size_pretty(pg_total_relation_size(c.oid)) AS "总大小",
ROUND(100.0 * pg_relation_size(c.oid) / pg_total_relation_size(c.oid), 2) AS "数据占比(%)",
ROUND(100.0 * pg_indexes_size(c.oid) / pg_total_relation_size(c.oid), 2) AS "索引占比(%)",
ROUND(100.0 * COALESCE(pg_total_relation_size(t.oid), 0) / pg_total_relation_size(c.oid), 2) AS "TOAST占比(%)"
FROM pg_class c
LEFT JOIN pg_class t ON c.reltoastrelid = t.oid
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'public'
AND c.relname = 'tbl_name'
AND c.relkind = 'r';
修改多个表的序列的值为表的最大id+1
-- 修改多个表的序列的值为表的最大id+1
DO $$
DECLARE
table_list text[] := array[
'public.tbl_1',
'public.tbl_2',
...,
'public.tbl_x'
];
table_name text;
column_name text := 'id'; -- 自增字段名
sequence_name text; -- 序列名称变量
max_val bigint; -- 当前序列值
BEGIN
FOREACH table_name IN ARRAY table_list LOOP
-- 1. 获取序列名称
SELECT pg_get_serial_sequence(table_name, column_name) INTO sequence_name;
RAISE NOTICE '序列名称: %', sequence_name;
-- 2. 检查序列是否存在
IF sequence_name IS NULL THEN
RAISE NOTICE '未找到表% 的字段 % 的关联序列,跳过当前表处理', table_name, column_name;
CONTINUE; -- 跳过当前循环,处理下一个表
END IF;
-- 3. 获取当前序列值
EXECUTE format('SELECT max(' || column_name || ') FROM ' || table_name) INTO max_val;
-- 处理max_val为NULL的情况(表中无数据时)
IF max_val IS NULL THEN
max_val := 0;
RAISE NOTICE '表中无数据,将max_val设为0';
END IF;
RAISE NOTICE '当前序列值: %', max_val;
-- 4. 将序列值更新为当前值+1
EXECUTE format('SELECT setval(%L, %s)', sequence_name, max_val + 1);
RAISE NOTICE '已将序列更新为: %', max_val + 1;
-- 5. 验证更新结果
EXECUTE format('SELECT last_value FROM ' || sequence_name) INTO max_val;
RAISE NOTICE '更新后序列值: %', max_val;
END LOOP;
END $$;##
-- mysql
DROP TABLE IF EXISTS `code_column`;
-- pgsql
DROP TABLE IF EXISTS code_column;CREATE TABLE if not exists "tmp_sys_user"
(
"id" BIGINT GENERATED BY DEFAULT AS IDENTITY,
"user_name" varchar(255) NOT NULL,
"create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE "tmp_sys_user" IS '用户信息';
COMMENT ON COLUMN "tmp_sys_user"."id" IS 'id';
COMMENT ON COLUMN "tmp_sys_user"."user_name" IS '用户名';
COMMENT ON COLUMN "tmp_sys_user"."create_time" IS '创建时间';
-- 主键
alter table "tmp_sys_user" add constraint pk_tmp_sys_user primary key ("user_id");
INSERT INTO "public"."tmp_sys_user" ("user_name", "create_time") VALUES ('abc', '2025-07-13 22:00:35');
-- 查看当前id自增值
SELECT pg_get_serial_sequence('"public"."tmp_sys_user"', 'id');
SELECT last_value FROM tmp_sys_user_id_seq;
ALTER TABLE "public"."tmp_sys_user" ALTER COLUMN "id" RESTART WITH 1000;
-- 再次查看当前id自增值
SELECT last_value FROM tmp_sys_user_id_seq;CREATE DATABASE mydb
WITH ENCODING 'UTF8'
LC_COLLATE='en_US.utf8'
LC_CTYPE='en_US.utf8'-- 检查当前数据库编码
SELECT datname, encoding, pg_encoding_to_char(encoding) FROM pg_database;
-- 检查服务器支持的编码
SHOW SERVER_ENCODING; -- 通常返回 UTF8TRUNCATE table "public"."$tableName" RESTART IDENTITY;备份sql & 还原sql
docker exec -t ${DOCKER_CONTAINER} pg_dump -U ${USER} ${DATABASE} > ${BACKUP_PATH}docker exec -t postgresql pg_dump -U postgres db_example > ./db_example_backup.sql
作者:张三 创建时间:2025-06-24 22:40
最后编辑:张三 更新时间:2025-11-11 11:04
最后编辑:张三 更新时间:2025-11-11 11:04