CLUSTER
Name
CLUSTER
Synopsis
CLUSTER indexname ON table name
輸入
indexname
一個索引名稱.
table
准備建簇的表的名稱.
輸出
CLUSTER
成功建簇.
ERROR: relation <tablerelation_number> inherits
ERROR: Relation table does not exist!
描述
CLUSTER指示PostgreSQL 近似地基於索引 indexname 的度量對表 table 進行存儲建簇. 索引必須已經在表 table name
當對一個表建簇後
注意
該表實際上按索引順序拷貝到了一個臨時表中
如果你只是隨機的訪問表中的行
另一個CLUSTER 很有幫助的例子是當你用索引從一個表中取出幾個記錄時
有兩種建簇的數據.第一種是用 CLUSTER 命令
另一個對數據建簇的方法是使用
SELECT column list INTO TABLE new table
FROM table ORDER BY column list
這個用法使用PostgreSQL 排序的代碼 ORDER BY 來匹配索引
用法
以雇員的薪水屬性對雇員關系建簇.
CLUSTER emp_ind ON emp;
兼容性 SQL
在 規范裡沒有 CLUSTER 語句.
COMMENT
COMMENT
Name
COMMENT
Synopsis
COMMENT ON
[
[ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ] object_name |
COLUMN lumn_name|
AGGREGATE agg_name agg_type|
FUNCTION func_name (arg
OPERATOR op (leftoperand_type rightoperand_type) |
TRIGGER trigger_name ON table_name
] IS
輸入
object_name
要加入評注的對象名稱.
text
要加入的評注.
輸出
COMMENT 成功對表評注後的返回.
描述
COMMENT存儲一個數據庫對象的評注
要修改一個評注
需要說明的是目前評注沒有安全機制∶任何聯接到某數據庫上地用戶 都可以看到所有該數據庫對象地評注(盡管只有超級用戶可以修改 不屬於它地對象的評注).因此
用法
給表mytable 加評注
COMMENT ON mytable IS
一些例子
COMMENT ON DATABASE my_database IS
COMMENT ON INDEX my_index IS
COMMENT ON RULE my_rule IS
COMMENT ON SEQUENCE my_sequence IS
COMMENT ON TABLE my_table IS
COMMENT ON TYPE my_type IS
COMMENT ON VIEW my_view IS
COMMENT ON COLUMN my_table
COMMENT ON AGGREGATE my_aggregate (double precision) IS
COMMENT ON FUNCTION my_function (timestamp) IS
COMMENT ON OPERATOR ^ (text
COMMENT ON TRIGGER my_trigger ON my_table IS
兼容性 SQL
裡沒有COMMENT.
COMMIT
COMMIT
Name
COMMIT
Synopsis
COMMIT [ WORK | TRANSACTION ]
輸入
WORK
TRANSACTION
可選關鍵字
輸出
COMMIT
提交成功返回此信息.
NOTICE: COMMIT: no transaction in progress
如果過程中沒有事務
描述
COMMIT提交當前事務. 所有事務的更改都將為其他事務可見
注意
關鍵字 WORK 和 TRANSACTION 都可以忽略.
使用 ROLLBACK語句退出一次事務.
用途
要讓所有變更永久化
COMMIT WORK;
兼容性 SQL
只聲明了兩種形式 COMMIT 和 COMMIT WORK
COPY
COPY
Name
COPY
Synopsis
COPY [ BINARY ] table [ WITH OIDS ] FROM {
BINARY
改變字段格式行為
table
現存表的名字.
WITH OIDS
拷貝每行的內部唯一對象標識(OID).
filename
輸入或輸出的 Unix 文件的絕對文件名.
stdin
聲明輸入是來自客戶端應用.
stdout
聲明輸入前往客戶端應用.
delimiter
用於在文件中每行中分隔各個字段的字符.
null string
個代表 NULL 值的字串
注意: 對於拷貝入(copy in)
輸出
COPY
拷貝成功完成.
ERROR: reason
拷貝失敗
描述
COPY在 PostgreSQL表和標准文件系統文件之間交換數據. COPY TO 把一個表的所有內容都拷貝到一個文件
COPY指示 PostgreSQL 後端直接從文件中讀寫數據.如果聲明了文件名
小提示: 不要把 COPY 和 psql 指令 \copy 混淆在一起. \copy 調用 COPY FROM stdin 或 COPY TO stdout
注意
BINARY 關鍵字將強制使用二進制對象而不是文本存儲/讀取所有數據. 這樣做在一定程度上比傳統的拷貝命令快
缺省地
你對任何要COPY 出來的數據必須有select 權限
COPY TO不會激活規則
COPY在第一個錯誤處停下來.這些在 COPY FROM中不應該導致問題
COPY命令裡面的文件必須是可以由後端直接讀或寫的文件
小技巧: psql指令 \copy 以客戶的權限讀或寫在客戶端的文件
我們建議在 COPY 裡的文件名字總是使用 絕對路徑.在 COPY TO 的時候是由後端強制 進行的
文件格式
文本格式
當不帶 BINARY 選項使用 COPY TO 時
每個元組的實際格式是
<attr
如果聲明了 WITH OIDST
如果 COPY TO 將它的輸出輸出到標准輸出而不是一個文件
反斜槓有其他的含義.一個文本反斜槓字符輸出成兩個連續的反斜槓 (
二進制格式
在PostgreSQLv
文件頭
文件頭由
簽名
整數布局域
以源機器的字節序的 int
標志域
int
Bit
如果為
頭擴展范圍長度
int
頭擴展數據是一個用來保留一個自定義的數據訓練用的.這個標志域無意告訴讀者擴展區的內容是什麼.頭擴展的具體設計內容留給以後的版本用.
這樣設計就允許向下兼容頭附加(增加頭擴展塊
元組
每條元組都以一個 int
零
數據域是 NULL.沒有數據跟著.
>
數據域是定長數據類型.和類型長字相同的准確的 N 字節.
數據域是變長的數據類型.下面四個字節是變長頭
<
保留為將來使用.
對於非 NULL 域
在數據域之間沒有對奇填充或者任何其它額外的數據.還要注意該格式並不區分一種數據類型是傳值還是傳參.這些東西都是非常有意的
如果在傾倒中包括了 OID
文件尾
文件尾包括一個 int
如果一個域計數字既不是
用法
下面的例子把一個表拷貝到標准輸出
COPY country TO stdout USING DELIMITERS
COPY country FROM
AF AFGHANISTANAL ALBANIADZ ALGERIAZM ZAMBIAZW ZIMBABWE\
下面的是同樣的數據
CREATE AGGREGATE
CREATE AGGREGATE
Name
CREATE AGGREGATE
Synopsis
CREATE AGGREGATE name ( BASETYPE = input_data_type
SFUNC = sfunc
[
[
輸入
name
要創建的聚集函數名.
input_data_type
本聚集函數要處理的基本數據類型. 對於不檢查輸入類型的聚集來說
sfunc
用於處理源數據列裡的每一個輸入數據的狀態轉換函數名稱. 它通常是一個兩個參數的函數
state_type
聚集的狀態值的數據類型.
ffunc
在轉換完所有輸入域/字段後調用的最終處理函數.它計算聚集的結果. 此函數必須接受一個類型為 state_type 的參數. 聚集的輸出數據類型被定義為此函數的返回類型.如果沒有聲明 ffunc 則使用聚集結果的狀態值作為聚集的結果
initial_condition
狀態值的初始設置(值).它必須是一個數據類型 state_type 可以接受的文本常量值. 如果沒有聲明
輸出
CREATE
命令執行成功的返回信息.
描述
CREATE AGGREGATE允許用戶或程序員通過定義新的聚集函數來擴展 PostgreSQL 的功能.一些用於基本類型的聚集函數如 min(integer) 和 avg(double precision) 等已經包含在基礎軟件包裡了. 如果你需要定義一個新類型或需要一個還沒有提供的聚集函數
一個聚集函數是用它的名字和輸入數據類型來標識的. 如果兩個聚集的輸入數據不同
一個聚集函數是用一個或兩個普通函數做成的
sfunc( internal
ffunc( internal
PostgreSQL 創建一個類型為 stype的臨時變量. 它保存這個聚集的當前內部狀態. 對於每個輸入數據條目
一個聚集函數還可能提供一個初始條件
如果在 pg_proc 裡該狀態轉換函數被定義為
如果狀態轉換函數不是 strict(嚴格)的
如果終轉換函數定義為
注意
使用 DROP AGGREGATE 刪除聚集函數.
CREATE AGGREGATE的參數可以以任何順序書寫
用法
請參考 PostgreSQL 程序員手冊 聚集函數章節的聚集函數部分獲取完整的例子.
兼容性 SQL
CREATE AGGREGATE是 PostgreSQL 語言的擴展. 在 裡沒有 CREATE AGGREGATE.
CREATE CONSTRAINT TRIGGER
CREATE CONSTRAINT TRIGGER
Name
CREATE CONSTRAINT TRIGGER
Synopsis
CREATE CONSTRAINT TRIGGER name
AFTER events ON
relation constraint attributes
FOR EACH ROW EXECUTE PROCEDURE func
輸入
name
約束觸發器的名稱.
events
觸發該觸發器的事件范圍.
relation
被觸發的關系名稱.
constraint
實際的約束聲明.
attributes
約束屬性.
func(args)
觸發器處理所調用的函數.
輸出
CREATE CONSTRAINT
成功創建後的返回信息.
描述
CREATE CONSTRAINT TRIGGER被 CREATE/ALTER TABLE 內部使用以及被 pg_dump 用於創建那些用於參考完整性的特殊的觸發器.
這條語句不是做一般用途用的.
CREATE DATABASE
CREATE DATABASE
Name
CREATE DATABASE
Synopsis
CREATE DATABASE name
[ WITH [ LOCATION =
[ TEMPLATE = template ]
[ ENCODING = encoding ] ]
輸入
name
要創建的數據庫名.
dbpath
在文件系統裡存儲新數據庫的可選位置
template
從哪個模板創建新數據庫
encoding
創建新數據庫用的多字節編碼方法.聲明一個字串文本名字 (比如
輸出
CREATE DATABASE
命令成功執行的返回信息.
ERROR: user
你必須有特殊的 CREATEDB 權限來創建數據庫
ERROR: createdb: database
如果聲明的數據庫 name 已經存在返回的信息.
ERROR: database path may not contain single quotes
數據庫路徑名 dbpath 不能包含單引號
ERROR: CREATE DATABASE: may not be called in a transaction block
如果你有一個明確的事務塊正在處理
ERROR: Unable to create database directory
ERROR: Could not initialize database directory
這種情況最有可能是因為對數據目錄權限不夠
描述
CREATE DATABASE創建一個新的 PostgreSQL 數據庫.創建者成為新數據庫的管理員.
可以聲明一個可選的數據庫位置
如果路徑名不包含斜槓
缺省時
可選的編碼參數允許選擇數據庫編碼
可選參數可以以任意順序寫
注意
CREATE DATABASE是 PostgreSQL 語言的擴展.
使用 DROP DATABASE刪除一個數據庫.
程序 createdb是 是這個命令的 shell 腳本的封裝
在用絕對路徑指定的可選數據庫位置時
盡管我們可以通過把某數據庫名聲明為模板從非template
用法
創建一個新的數據庫
olly=> create database lusiadas;
在另一個地方 ~/private_db創建新數據庫
$ mkdir private_db
$ initlocation ~/private_db
The location will be initialized with username
This user will own all the files and must also own the server process
Creating directory /home/olly/private_db
Creating directory /home/olly/private_db/base
initlocation is complete
$ psql olly
Welcome to psql
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
olly=> CREATE DATABASE elsewhere WITH LOCATION =
CREATE DATABASE
兼容性 SQL
在 裡沒有 CREATE DATABASE 語句. 數據庫等同於目錄
CREATE FUNCTION
CREATE FUNCTION
Name
CREATE FUNCTION
Synopsis
CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [
RETURNS rettype
AS
LANGUAGE
[ WITH ( attribute [
CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [
RETURNS rettype
AS
LANGUAGE langname
[ WITH ( attribute [
描述
CREATE FUNCTION定義一個新的函數. CREATE OR REPLACE FUNCTION 將要麼創建一個新函數
參數
name
要創建的函數名字.這個名字可以不是唯一的
argtype
該函數的數據類型(如果有).輸入類型可以是基本類型
rettype
返回數據類型.輸出類型可以聲明為一個基本類型
definition
一個定義函數的字串
obj_file
這個形式的 AS 子句用於在函數的 C 源文件 名字和 SQL 函數的名字不同的時候動態聯接 C 語言函數. 字串 obj_file 是包含可動態裝載的對象的文件名
langname
可以是 SQL
attribute
一段可選的有關該函數的信息
創建該函數的用戶成為該函數所有者.
下面的屬性可以出現在 WITH 子句裡∶
iscachable
Iscachable 表示此函數在輸入相同時總是返回相同的值 (也就是說
isstrict
isstrict 表明如果它的任何參數是 NULL
注意
請參閱 PostgreSQL 程序員手冊 關於通過函數擴展 PostgreSQL 的章節獲取更多關於書寫外部函數的信息.
我們允許你將完整的 SQL 類型語法用於 輸入參數和返回值.不過
PostgreSQL 允許函數 重載
兩個 internal 函數擁有相同 C 名稱時肯定會發生鏈接時錯誤
類似的還有
如果重復調用 CREATE FUNCTION
使用 DROP FUNCTION 刪除一個用戶定義函數.
要更新現存函數的定義
如果你刪除然後重新創建一個函數
例子
要創建一個簡單的 SQL 函數∶
CREATE FUNCTION one() RETURNS integer
AS
LANGUAGE SQL;
SELECT one() AS answer;
answer
這個例子通過調用一個用戶創建的名為 funcs
CREATE FUNCTION ean_checkdigit(char
AS
CREATE TABLE product (
id char(
eanprefix char(
REFERENCES brandname(ean_prefix)
eancode char(
CONSTRAINT ean CHECK (ean_checkdigit(eanprefix
);
這個例子創建一個在用戶定義類型 complex 和內部類型 point 之間做類型轉換的函數
CREATE FUNCTION point(complex) RETURNS point
AS
LANGUAGE C;
該函數的 C 聲明可以是∶
Point * complex_to_point (Complex *z)
{
Point *p;
p = (Point *) palloc(sizeof(Point));
p
p
return p;
}
兼容性 SQL
在 SQL
又見
DROP FUNCTION
From:http://tw.wingwit.com/Article/program/Oracle/201311/18929.html