# 配置文件位置 $ sudo vim /var/lib/pgsql/11/data/postgresql.conf # 监听外部请求->修改配置文件 # - Connection Settings - listen_addresses = '*'# 这里改为监听全网 #listen_addresses = 'localhost' # what IP address(es) to listen on; # comma-separated list of addresses; # defaults to 'localhost'; use '*' for all # (change requires restart) #port = 5432 # 默认端口
# 允许外部访问,编辑下列配置文件,修改认证方法为md5 $ sudo vim /var/lib/pgsql/11/data/pg_hba.conf # TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only local all all trust # 本地访问 # IPv4 local connections: host all all 0.0.0.0/0 md5 # ipv4 允许全网访问,密码验证 # host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5
1 2 3 4 5 6 7
- 配置用户,设置管理员用户密码
```bash # 配置管理员(postgres)用户密码 [root@localhost ~]# su - postgres -bash-4.2$ psql -c "alter user postgres with password '123456'" # 配置管理员密码,也可配置其他用户
# 使用事务操作,需要使用BEGIN和COMMIT关键字来包裹 BEGIN; UPDATE accounts SET balance = balance -100.00 WHERE name ='Alice'; -- etc etc COMMIT; # 使用保存点和ROLLBACK来回滚变更操作 BEGIN; UPDATE accounts SET balance = balance -100.00 WHERE name ='Alice'; SAVEPOINT my_savepoint; # 建立保存点 UPDATE accounts SET balance = balance +100.00 WHERE name ='Bob'; -- oops ... forget that and use Wally's account ROLLBACKTO my_savepoint; # 回滚到保存点 UPDATE accounts SET balance = balance +100.00 # 回滚完成之后继续执行本地语句 WHERE name ='Wally'; COMMIT;
-- with as 语法 with tmp_tab as (select id from test_tab) select*from tmp_tab;
-- 创建序列(自增序列) 最新的数据库支持 serial 字段,自增字段 CREATE SEQUENCE users_id_seq STARTWITH1 INCREMENT BY1 NO MINVALUE NO MAXVALUE CACHE 1; -- 修改存在的字段为序列字段 alter table users altercolumn id setdefault nextval('users_id_seq');
-- 视图操作相关 -- 创建视图 CREATEVIEW view_name AS SELECT column_name(s) FROM table_name WHEREcondition ORDERBY column_name -- 删除视图 DROPVIEW view_name; -- 更新视图结构 CREATEOR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHEREcondition; -- 其中 CREATE OR REPLACE VIEW 是 pg 的语言扩展功能。
特别记录
不熟练的操作记录
转换字符串浮点数到double类型
使用case根据正则判断然后转换数据
1 2 3 4 5 6
WITH subquery AS (SELECT'1.1232'::text asvalue) SELECT CASEWHENvalue~'^(-)?[0-9]+\.?([0-9]+)?$' THENvalue::double precision ELSE0 ENDFROM subquery;
随机数生成
按照指定范围生成整数或者小数
1 2 3 4
-- 指定范围的小数 0.00001 <= x < 0.001 并保留 6位小数 SELECT round((random()*(0.001-0.00001)+0.00001)::numeric ,6); -- 指定范围的整数 10 <= x < 25之间 SELECTfloor(random()*(25-10)+10);
查看正在执行的sql
用于解决莫名其妙的等待sql执行完成错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
SELECT procpid, start, now() -startAS lap, current_query FROM (SELECT backendid, pg_stat_get_backend_pid(S.backendid) AS procpid, pg_stat_get_backend_activity_start(S.backendid) ASstart, pg_stat_get_backend_activity(S.backendid) AS current_query FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS S ) AS S ,pg_stat_activity pa WHERE current_query <>'<IDLE>'and procpid<> pg_backend_pid() and pa.pid=s.procpid and pa.state<>'idle' ORDERBY lap DESC;
Server has startup warnings: 2019-04-27T09:45:30.588+0800 I CONTROL [initandlisten] 2019-04-27T09:45:30.588+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2019-04-27T09:45:30.588+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2019-04-27T09:45:30.588+0800 I CONTROL [initandlisten] 2019-04-27T09:45:30.588+0800 I CONTROL [initandlisten] 2019-04-27T09:45:30.589+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2019-04-27T09:45:30.589+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2019-04-27T09:45:30.589+0800 I CONTROL [initandlisten] 2019-04-27T09:45:30.589+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2019-04-27T09:45:30.589+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2019-04-27T09:45:30.589+0800 I CONTROL [initandlisten]
alter sequence computer_room_id increment by2 minvalue 1 maxvalue 999999999
使用序列
1 2 3 4
-- 获取 select computer_room_id.Nextval from dual -- 插入时获取 insert into computer_room_info(id, city_name, room_name) values(computer_room_id.Nextval,'city','room')
同时插入多条数据
Oracle的insert和MySQL有点区别,insert后面的values不能写多个
1 2 3 4
INSERTall INTO table_1(col_1,col_2) values(val_1, val_2) INTO table_2(col_1,col_2) values(val_1, val_2) SELECT1FROM DUAL
带条件的INSERT ALL
1 2 3 4 5 6 7 8 9
INSERTALL WHEN order_total <100000THEN INTO small_orders WHEN order_total >100000AND order_total <200000THEN INTO medium_orders ELSE INTO large_orders SELECT order_id, customer_id, order_total, sales_rep_id FROM orders
插入或者更新
从T2表获取数据插入或者更新T1表的内容
1 2 3 4
MERGEINTO TEST T1 USING (SELECT'2'as A FROM dual) T2 on (T1.ID=T2.ID) WHEN MATCHED THENUPDATESET T1.NAME='newtest2' WHENNOT MATCHED THENINSERT (T1.ID, T1.NAME) VALUES ('1', 'newtest2');