Postgresl測試--構造資料
阿新 • • 發佈:2019-01-03
O
管理端登入:>psql postgres1) 資料庫的命令列管理指令碼1-1) 建立資料庫=> CREATE DATABASE 資料庫名 WITH ENCODING '資料庫編碼' OWNER 擁有者 TEMPLATE 模板名 TABLESPACE 表空間名;其中WITH ENCODING、OWNER、TEMPLATE 和 TABLESPACE都是可選引數,不設定就使用資料庫的預設值。如 =>CREATE DATABASEtestdb WITH ENCODING 'utf8' OWNER test;另外預設情況下是根據模板template1建立的資料庫(表空間為pg_default),如果要建立一個真正空白的資料庫,可以改用模板template0,因為
1-2) 刪除資料庫=> DROP DATABASE 資料庫名;如果當前資料庫存在會話,會提示你而無法刪除。1-3) 使用者許可權管理PostgreSQL的角色包括我們常說的資料庫使用者或者使用者組。建立角色:=> create role 角色名;刪除角色:=> drop role 角色名; ----如果角色是某個資料庫的屬主,刪除時會有提示而無法刪除檢視已存在的角色:=> \du 或 select rolname from pg_roles;建立使用者:=> create user 使用者名稱; 或 create role 使用者名稱 login;注:只有建立的角色包含login屬性,才能使用該角色連線資料庫。如要指定使用者的登入密碼,使用=> create role 使用者名稱 login password '登入密碼';
有以下幾種許可權:SELECT(讀), INSERT(追加), UPDATE(寫),DELETE, RULE(規則),REFERENCES(外來鍵), TRIGGER, CREATE,TEMPORARY,EXECUTE, USAGE,和 ALL PRIVILEGES。alter default privileges的使用a) 授予預設許可權:alter default privileges for user 【使用者1】 in schema public grant select on tables to 【使用者2】 ;使用這個語句後, 【使用者1】 再建新表時, 【使用者2】 就會自動有對這些新表的select許可權。注意執行這個語句後,在這個語句之前 【使用者1】 的老表, 【使用者2】 仍然是沒有select許可權的。這時需要手工把舊錶的select權賦給scott使用者,然後再使用alter default privileges就實現了只讀使用者scott。b) 收回授予的預設許可權:alter default privileges for user 【使用者1】 in schema public revoke select on tables from 【使用者2】;執行這個語句之前,alter default privileges .... grant語句之後, 【使用者1】 建的表, 【使用者2】 已經有select許可權的,這個語句不會收回這些select許可權。c) 檢視alter default privileges許可權的方法是使用 # /ddp;總結:alter default privileges並不會改變已有使用者的許可權,只有在有物件建立時,才會根據alter default privileges定義的情況給指定的使用者加許可權,這個語句有點象是在建物件時加了一個許可權觸發器。1-4) 關於表空間資料庫預設存在pg_global、pg_default兩個表空間,pg_default是template0和template1使用的也是新建資料庫的預設表空間。建立一個新的表空間:=> CREATE TABLESPACE fastspace LOCATION '/mnt/sda1/postgresql/data';注:所指定的表空間路徑必須存在、為空及為PostgreSQL系統帳號的擁有者。
檢視現有的表空間資訊:=> \db 或 => select spcname from pg_tablespace;設定預設的表空間:=> SET default_tablespace = space1;將表建立到指定的表空間:=> CREATE TABLE foo(i int) TABLESPACE space1;更多:1-5) 檢視資料庫的版本資訊:=> select version();1-5) 檢視資料庫的命令幫助:=> \h 或 \?\h檢視的是SQL命令,如create table等;\?檢視的是psql的元資料命令,如\db等。1-6) 備份資料庫為sql檔案:> pg_dump -U bcsystem > bcsystem.sql -- 使用者bcsystem是資料庫bcsystem的屬主1-7) 恢復備份的sql檔案:> psql -U bcsystem -f bcsystem.sql -- 使用者bcsystem是資料庫bcsystem的屬主> psql -h192.168.0.222 -U bcsystem -W -f bcsystem.sql -- 使用者bcsystem是資料庫bcsystem的屬主=> \i 檔名.sql ---- 如果要輸出詳細的執行資訊,=> set echo to all;2) 資料表維護指令碼2-1) 新增列:ALTER TABLE bs_case_advice ADD COLUMN is_invalid boolean DEFAULT false;2-2) 刪除列:ALTER TABLE bs_case_advice DROP COLUMN is_invalid;2-3) 修改列名:ALTER TABLE bs_case_advice RENAME is_invalid TO is_invalid1;2-4) 修改列型別:ALTER TABLE bs_case_advice ALTER COLUMN is_invalid TYPE boolean;2-5) 修改列預設值:ALTER TABLE bs_case_advice ALTER COLUMN is_invalid SET DEFAULT false;
=> CREATE DATABASE 資料庫名 WITH ENCODING '資料庫編碼' OWNER 擁有者 TEMPLATE 模板名 TABLESPACE 表空間名;
) SQL注意事項2-1) 使用 select distinct ... order by aa時,order by後的欄位必須在select的欄位中包含,否則報錯2-2) 查詢語句中使用別名時,統一使用as關鍵字可以避免不必要的錯誤如 t.name name、t.type type會報錯,改為 t.name as name、t.type as type就不會報錯了2-3) 使用hibernate時,如果domain欄位的型別為boolean,資料庫欄位也必須用boolean,不能用integer代替,如"INNER_ boolean not null default false,"2-4) 官方文件中有說使用integer欄位型別,速度是最快的,但integer型別不支援限定長度,如integer(2)的語法是錯誤的,如果要控制長度則只能使用numeric(2)來代替
) 其它啟動:$ sudo /etc/init.d/postgresql-9.1 start停止:$ sudo /etc/init.d/postgresql-9.1 stop-)設定客戶端編碼:=> SET CLIENT_ENCODING TO 'utf8';或 => \encoding 'utf8';-)檢視客戶端編碼:=> \encoding-)替換bytea欄位內的部分值:update act_ge_bytearray set bytes_ = overlay(bytes_ placing E'2013-04-25'::bytea from position(E'2013-03-25'::bytea in bytes_))where id_ in ('398416','398420');-)轉換資料型別:select cast(id as varchar(255)),... from ... (id原為int型別,這裡將其轉換為varchar型別)-)數字格式化:to_char(16.5,'FM99D0') -> 16.5, to_char(16,'FM999D0') -> 16.0-)構建1-12的連續資料:select * from generate_series(1,12) order by 1 或 使用遞迴WITH RECURSIVE T(N) AS ( VALUES (1) UNION ALL SELECT N+1 FROM T WHERE N < 12) SELECT N FROM T; -)陣列轉為行:SELECT UNNEST(ARRAY['a','b','c','d']) AS names