数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

超详细sql大全(3)


发布日期:2018年01月14日
 
超详细sql大全(3)

CREATE FUNCTION

Name

CREATE FUNCTION 定义一个新函数

Synopsis

CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [ ] ] )

RETURNS rettype

AS definition

LANGUAGE langname

[ WITH ( attribute [ ] ) ]

CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [ ] ] )

RETURNS rettype

AS obj_file link_symbol

LANGUAGE langname

[ WITH ( attribute [ ] ) ]

描述

CREATE FUNCTION定义一个新的函数. CREATE OR REPLACE FUNCTION 将要么创建一个新函数要么替换现有的定义.

参数

name

要创建的函数名字.这个名字可以不是唯一的 因为函数可以重载胆识同名的函数必须有不同的参数类型.

argtype

该函数的数据类型(如果有).输入类型可以是基本类型也可以是复合类型opaque或者和一个现有字段相同的类型. Opaque 表示该函数接受非 SQL 类型比如 char *. 一个字段的类型是用 lumnname%TYPE 表示的使用这个东西可以帮助函数独立于表定义的修改.

rettype

返回数据类型.输出类型可以声明为一个基本类型复合类型 setof 类型opaque 或者和现有字段同类型. setof 修饰词表示该函数将返回一套条目而不是一条条目.返回类型声明为 opaque 的函数不返回数值.它们不能直接调用触发器函数可以利用这个 特性.

definition

一个定义函数的字串含义取决于语言.它可以是一个内部函数名字 一个指向某个目标文件的路径一个 SQL 查询或者一个用过程语言 写的文本.

obj_file link_symbol

这个形式的 AS 子句用于在函数的 C 源文件 名字和 SQL 函数的名字不同的时候动态联接 C 语言函数. 字串 obj_file 是包含可动态装载的对象的文件名而 link_symbol 是对象的联接符号也就是该函数在 C 源文件列的名字.

langname

可以是 SQLC internal或者 plname这里的 plname 是一种已创建过程语言的名字. 参阅 CREATE LANGUAGE获取细节. 为了保持向下兼容该名字可以用单引号包围.

attribute

一段可选的有关该函数的信息用于优化.见下文获取细节.

创建该函数的用户成为该函数所有者.

下面的属性可以出现在 WITH 子句里∶

iscachable

Iscachable 表示此函数在输入相同时总是返回相同的值 (也就是说 它不做数据库查找或者是使用没有直接在它的参数列表出现的信息) 优化器使用 iscachable 来认知对该函数的调用进行预先计算是否安全

isstrict

isstrict 表明如果它的任何参数是 NULL此函数总是返回 NULL. 如果声明了这个属性则如果存在 NULL 参数时不会执行该函数 而只是自动假设一个 NULL 结果.如果没有声明 isstrict 该函数将为 NULL 输入调用并进行处理. 那么剩下的事就是函数作者的责任来检查 NULL 是否必须并且做相应响应.

注意

请参阅 PostgreSQL 程序员手册 关于通过函数扩展 PostgreSQL 的章节获取更多关于书写外部函数的信息.

我们允许你将完整的 SQL 类型语法用于 输入参数和返回值.不过有些类型声明的细节(比如 numeric 类型的精度域)是由下层函数实现负责的 并且会被 CREATE FUNCTION 命令悄悄地吞掉. (也就是说不再被识别或强制).

PostgreSQL 允许函数 重载也就是说同一个函数名可以用于几个不同的函数 只要它们的参数可以区分它们不过这个功能在用于 internal(内部)和 C 语言 的函数时要小心

两个 internal 函数拥有相同 C 名称时肯定会发生链接时错误 要解决这个问题给它们赋予不同的 C 名称(例如使用参数类型做为 C 名称的一部分)然后在 CREATE FUNCTION 的 AS 子句里面声明这些名字 如果 AS 子句为空那么 CREATE FUNCTION 假设函数的 C 名称与SQL名称一样

类似的还有如果用多个 C 语言函数重载 SQL 函数 给每个 C 语言函数的实例一个独立的名称然后使用 CREATE FUNCTION 语法里的 AS 句的不同形式来选择每个重载的 SQL 函数的正确的 C 语言实现.

如果重复调用 CREATE FUNCTION并且都指向同一个目标文件那么该文件只装载一次.要卸载和恢复装载 该文件(可能是在开发过程中)你可以使用 LOAD命令.

使用 DROP FUNCTION 删除一个用户定义函数.

要更新现存函数的定义用 CREATE OR REPLACE FUNCTION.请注意不可能用这种方法改变一个函数的名字或者参数类型 (如果你这么干你只是会创建一个新的不同的函数). 同样CREATE OR REPLACE FUNCTION 也不会 让你改变一个现存函数的返回类型.要干这些事你必须删除并 重新创建该函数.

如果你删除然后重新创建一个函数新函数和旧的并非相同实体 你会破坏现存的引用了原有函数的规则视图触发器等等.使用 CREATE OR REPLACE FUNCTION 可以改变一个函数的定义而又不会破坏引用该函数的对象.

例子

要创建一个简单的 SQL 函数∶

CREATE FUNCTION one() RETURNS integer

AS SELECT AS RESULT;

LANGUAGE SQL;

SELECT one() AS answer;

answer

这个例子通过调用一个用户创建的名为 funcsso (扩展名因平台而异)的共享库过程创建一个 C 函数. 该共享库文件应该位于服务器的动态搜索路径里.该路径计算一个检测位并且如果函数参数里的检测位 正确就返回一个 TRUE .这些可以通过用一个 CHECK 约束实现的.

CREATE FUNCTION ean_checkdigit(char char) RETURNS boolean

AS funcs LANGUAGE C;

CREATE TABLE product (

id char() PRIMARY KEY

eanprefix char() CHECK (eanprefix ~ []{}[]{})

REFERENCES brandname(ean_prefix)

eancode char() CHECK (eancode ~ []{})

CONSTRAINT ean CHECK (ean_checkdigit(eanprefix eancode))

);

这个例子创建一个在用户定义类型 complex 和内部类型 point 之间做类型转换的函数该函数是用一个从 C 源代码编译的 动态装载的对象来实现的(我们演示了使用声明共享目标文件 的准确路径名的过时方法). 对于 PostgreSQL 而言 要自动寻找类型转换函数SQL 函数必须和返回类型同名因而重载是不可避免的 该函数名通过使用 SQL定义里 AS 子句的第二种类型来重载

CREATE FUNCTION point(complex) RETURNS point

AS /home/bernie/pgsql/lib/complexso complex_to_point

LANGUAGE C;

该函数的 C 声明可以是∶

Point * complex_to_point (Complex *z)

{

Point *p;

p = (Point *) palloc(sizeof(Point));

p>x = z>x;

p>y = z>y;

return p;

}

兼容性 SQL

在 SQL 里的确定义了一个CREATE FUNCTION PostgreSQL 的和它类似但是不兼容.这个属性是不可移植的可以使用的不同语言也是如此.

又见

DROP FUNCTION LOAD PostgreSQL程序员手册

CREATE GROUP

CREATE GROUP

Name

CREATE GROUP 定义一个新的用户组

Synopsis

CREATE GROUP name [ [ WITH ] option [ ] ]

这里 option 可以是∶

SYSID gid

| USER username [ ]

输入

name

组名

gid

SYSID 子句可以用于选择 PostgreSQL 里新组的组标识(group id) 不过这样做不是必须的

如果没有声明这个将使用从 开始的已分配的最高组标识加一作为缺省值

username

包括到组里面的用户列表用户必须已经存在

输出

CREATE GROUP

成功创建组后的返回

描述

CREATE GROUP 将在数据库节点上创建一个新组参考管理员手册获取关于使用组来认证的信息 要使用这条命令 你必须是数据库超级用户

使用 ALTER GROUP修改组成员DROP GROUP删除一个组

用法

创建一个空组

CREATE GROUP staff

创建一个有成员的组

CREATE GROUP marketing WITH USER jonathan david

兼容性 SQL

里没有 CREATE GROUP Roles 在概念上与组类似

CREATE LANGUAGE

CREATE LANGUAGE

Name

CREATE LANGUAGE 定义一种新的过程语言

Synopsis

CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE langname

HANDLER call_handler

描述

使用 CREATE LANGUAGE 一个PostgreSQL 用户可以在 PostgreSQL里注册一个新的语言.因而函数和触发器过程可以用这种新语言定义.要注册新 语言用户必须具有 PostgreSQL 超级用户权限.

CREATE LANGUAGE将该语言的名字和一个调用句柄 关联起来而该调用句柄负责执行该语言书写的函数.请参考程序员手册获取有关语言调用句柄的 更多信息.

请注意过程语言是对每个独立的数据库而言是自己的. 要让一种语言缺省时可以为所有数据库获得那你应该把它安装到 template 数据库里.

参数

TRUSTED

TRUSTED 说明对该语言的调用句柄是安全的也就是说它不会提供给非特权用户任何绕过访问限制的能力. 如果忽略这个关键字只有具有 PostgreSQL 超级用户权限的人可以使用这个语言创建新的函数.

PROCEDURAL

这是个没有用的字.

langname

新的过程化语言的名称.语言名是大小写无关的. 一个过程化语言不能覆盖 PostgreSQL内置的语言.

出于向下兼容的原因这个名字可以用单引号包围.

HANDLER call_handler

call_handler是一个以前注册过的函数的名字该函数将被调用来执行这门过程语言写的函数.过程语言的调用句柄必须用一种编译语言书写比如 C调用风格必须 是版本 的调用风格并且在 PostgreSQL 里注册为不接受参数并且返回 opaque 类型的函数 (opaque 是用于未声明或未定义类型的占位符). undefined types

诊断

CREATE

如果语言成功创建返回此信息.

ERROR: PL handler function funcname() doesnt exist

如果没有找到函数 funcname() 则返回此信息.

注意

这条命令通常不应该由用户直接执行. 对于 PostgreSQL 版本里提供的过程语言我们应该使用 createlang脚本 它将为我们安装正确的调用句柄. (createlang 也会在内部调用 CREATE LANGUAGE.)

使用 CREATE FUNCTION 命令创建新函数.

使用 DROP LANGUAGE或者更好是 droplang脚本删除一个过程语言.

系统表 pg_language 记录了更多有关 当前安装的过程语言的信息.

Table pg_language

Attribute | Type | Modifier

++

lanname | name |

lanispl | boolean |

lanpltrusted | boolean |

lanplcallfoid | oid |

lancompiler | text |

lanname | lanispl | lanpltrusted | lanplcallfoid | lancompiler

++++

internal | f | f | | n/a

C | f | f | | /bin/cc

sql | f | f | | postgres

目前一种过程语言创建之后它的定义就不能再更改.

例子

下面两条顺序执行的命令将注册一门新的过程语言及其关联的调用句柄.

CREATE FUNCTION plsample_call_handler () RETURNS opaque

AS $libdir/plsample

LANGUAGE C;

CREATE LANGUAGE plsample

HANDLER plsample_call_handler;

兼容性 SQL

CREATE LANGUAGE是 PostgreSQL 扩展.

历史

CREATE LANGUAGE命令第一次出现在 PostgreSQL

又见

createlang CREATE FUNCTION droplang DROP LANGUAGE PostgreSQL 程序员手册

CREATE OPERATOR

CREATE OPERATOR

Name

CREATE OPERATOR 定义一个新的操作符

Synopsis

CREATE OPERATOR name ( PROCEDURE = func_name

[ LEFTARG = lefttype

] [ RIGHTARG = righttype ]

[ COMMUTATOR = com_op ] [ NEGATOR = neg_op ]

[ RESTRICT = res_proc ] [ JOIN = join_proc ]

[ HASHES ] [ SORT = left_sort_op ] [ SORT = right_sort_op ] )

输入

name

要定义的操作符可用的字符见下文

func_name

用于实现该操作符的函数

lefttype

如果存在的话操作符左手边的参数类型. 如果是左目操作符这个参数可以省略

righttype

如果存在的话操作符右手边的参数类型. 如果是右目操作符这个参数可以省略

com_op

该操作符对应的交换(commutator)操作符

neg_op

对应的负操作符

res_proc

此操作符约束选择性计算函数

join_proc

此操作符连接选择性计算函数

HASHES

表明此操作符支持哈希(散列)连接

left_sort_op

如果此操作符支持融合连接(join)此操作符的左手边数据的排序操作符

right_sort_op

如果此操作符支持融合连接(join)此操作符的右手边数据的排序操作符

输出

CREATE

成功创建操作符后的返回信息.

描述

CREATE OPERATOR定义一个新的操作符 name. 定义该操作符的用户成为其所有者.

操作符 name 是一个最多NAMEDATALEN 长的(缺省为 个)下列字符组成的字串

+ * / < > = ~ ! @ # % ^ & | ` ? $

你选择名字的时候有几个限制

$: 不能定义为单字符操作符 但是它们可以是一个多字符操作符的名称的一部分.

/* 不能在操作符名字的任何地方出现 因为它们会被认为是一个注释的开始.

一个多字符的操作符名字不能以 + 结尾 除非该名字还包含至少下面字符之一

~ ! @ # % ^ & | ` ? $

例如 @ 是一个允许的操作符名 但 * 不是. 这个限制允许 PostgreSQL 分析 SQL有问题的查询而不要求在符号之间有空白.

注意: 当使用非 SQL标准操作符名时 你通常将需要用空白把联接的操作符分离开以避免含混.例如如果你定义了一个左目操作符名为 @你不能写 X*@Y你必须写成 X* @Y 以保证 PostgreSQL 把它读做两个操作符而不是一个.

操作符 != 在输入时映射成 <> 因此这两个名称总是相等的.

至少需要定义一个 LEFTARG 或 RIGHTARG. 对于双目操作符来说两者都需要定义. 对右目操作符来说只需要定义 LEFTARG 而对于左目操作符来说只需要定义 RIGHTARG.

同样 func_name 过程必须已经用 CREATE FUNCTION 定义过 而且必须定义为接受正确数量的指定类型参数(一个或是两个).

如果存在换向操作符则必须指明这样 PostgreSQL 可以按它的意愿转换操作符的方向.例如操作符面积小于 <<< 很有可能有一个转换操作符面积大于操作符 >>> 因此查询优化器可以自由的将下面查询从

box (() ()) >>> MYBOXESdescription

转换到

MYBOXESdescription <<< box (() ())

这就允许执行代码总是使用后面的形式而某种程度上简化了查询优化器.

类似地如果存在负号操作符则也应该声明 假设一个操作符面积相等 ===存在同样有一个面积不等操作符 !==. 负号操作符允许查询优化器将

NOT MYBOXESdescription === box (() ())

简化成

MYBOXESdescription !== box (() ())

如果提供了一个交换操作符名称 PostgreSQL 将在表中查找它.如果找到而且其本身没有一个交换符那么交换符表将被更新以当前(最 新)创建的操作符作为它的交换符.这一点一样适用于负号操作符. 这就允许定义两个互为交换符或负号符的操作符.第一个操作符应该定义为没有交换符 或负号符(as appropriate). 当定义第二个操作符时将第一个符号作为交换符或负号符.第一个将因上述的副作用一样被更新(而获得交换符 或负号符).(对于PostgreSQL 把两个操作符指向对方同样也行

HASHESSORT和 SORT 选项将为查询优化器进行连接查询时提供支持. PostgreSQL 能够总是用反复替换来计算一个连接(也就是说处理这样的子句该子句有两个元组变量 这两个变量被一个操作符分开这个操作符返回一个boolean量) [WONG]. 另外 PostgreSQL 可以延着 [SHAP]实现一个散列-连接算法(hashjoin algorithm)但是我们必须知道这个策略是否可行.目前的散列-连接算法只是对代表相等 测试的操作符有效而且数据类型的相等必须意味着类型的表现是按位相等的 (例如一个包含未用的位的数据类型这些位对相等测试没有影响但却不能用于哈希连接)HASHES 标记告诉优化器 对这个操作符可以安全地使用哈希连接

类似的两目排序操作符告诉查询优化器一个融合-排序 (mergesort)是否是一个可用的连接策略并且告诉优化器使用哪个操作符来对这两个操 作数表排序.排序操作符应该只提供给相等操作符 并且它们应该对应用于相应的左边和右边数据类型的小于操作符

如果发现有其他联合策略可用 PostgreSQL 将更改优化器和运行时系统以利用这些策略并且在定义一个操作符时将需要更多的声明.幸运的是研究 团队不经常发明新的联合策略 而且增加用户定义联合策略的方法看来与其实现的复杂性相比是不值得的

RESTRICT 和 JOIN 选项帮助优化器计算结果的尺寸大小.如果像下面的语句

MYBOXESdescription <<< box (()())

在判断条件中出现那么 PostgreSQL 将不得不估计 MYBOXES 中满足该子句的记录数量的范围的大小. 函数 res_proc 必需是一个注册过的函数(也就是说它已经用 CREATE FUNCTION定义过了)它接受一个正确数据的数据类型作为参数返回一个浮点数. 查询优化器只是简单的调 用这个函数将参数 (()()) 传入并且把结果乘以关系(表)尺寸以获得所需要的记录的数值

类似的当操作符的两个操作数都包含记录变量时 优化器必须计算联合结果的尺寸. 函数 join_proc 将返回另一个浮点数这个数就是将两个表相关 的记录相乘计算出预期结果的尺寸.

函数

my_procedure_ (MYBOXESdescription box (() ()))

和操作符

MYBOXESdescription === box (() ())

之间的区别是 PostgreSQL 试图优化操作符并且可以决定使用索引来缩小相关操作符的搜索区间.但是对函数将不会有任何优化的动作而且是强制 执行.最后函数可有任意个参数而操作符限于一个或两个.

注意

请参阅 PostgreSQL 用户手册 中操作符章节获取更多信息.请使用 DROP OPERATOR 从数据库中删除用户定义操作符.

用法

下面命令定义一个新操作符面积相等用于 BOX 数据类型.

CREATE OPERATOR === (

LEFTARG = box

RIGHTARG = box

PROCEDURE = area_equal_procedure

COMMUTATOR = ===

NEGATOR = !==

RESTRICT = area_restriction_procedure

JOIN = area_join_procedure

HASHES

SORT = <<<

SORT = <<<

);

兼容性 SQL

CREATE OPERATOR是 PostgreSQL 扩展. 在中没有 CREATE OPERATOR 语句.

CREATE RULE

CREATE RULE

Name

CREATE RULE 定义一个新的重写规则

Synopsis

CREATE RULE name AS ON event

TO object [ WHERE condition ]

DO [ INSTEAD ] action

这里 action 可以是

NOTHING

|

query

|

( query ; query )

|

[ query ; query ]

输入

name

创建的规则名.

event

事件是 SELECT UPDATEDELETE 或 INSERT 之一.

object

对象是 table 或 lumn.(目前只有 table 形式实际上是实现了的.

condition

任意 SQL 布尔条件表达式.条件表达式除了引用 new 和 old 之外不能引用任何表.

query

组成 action 的查询可以是任何 SQL SELECTINSERT UPDATEDELETE或 NOTIFY 语句之一.

在 condition 和 action 里特殊表名字 new 和 old 可以用于指向引用表 ( object) 里的数值 new 在 ON INSERT 和 ON UPDATE 规则里 可以指向被插入或更新的新行. old 在 ON UPDATE和 ON DELETE 规则里可以指向现存的被更新或者删除的行.

输出

CREATE

成功创建规则后的返回信息.

描述

PostgreSQL 规则系统 允许我们在从数据库或表中更新 插入或删除东西时定义一个可选的动作来执行目前规则用于实现表视图

规则的语意是在一个单独的记录正被访问更新插入或删除时 将存在一个旧记录(用于检索更新和删除)和一个新记录 (用于更新和追加).这时给定事件类型和给定目标对象(表)的所有规则都将被检查 (顺序不定). 如果在 WHERE (如果有)子句里面所声明的 condition? 为真那么 action 部分的规则就被执行. 如果声明了 INSTEAD那么 action 就会代替原来的查询否则如果是 ON INSERT 那么它在原来的查询之后执行如果是 ON UPDATE 或者 ON DELETE那么它在原来的查询之前执行.在 condition 和 action 里面 在旧记录里字段的数值和/或新记录里字段的数值被 old attributename 和 new attributename 代替.

规则的 action 部分可以由一条或者多条查询组成.要写多个查询用圆括弧或者方括弧 把它们包围起来. 这样的查询将以声明的顺序执行(只是我们不能保证对一个对象的多个规则的执行顺序). action 还可以是 NOTHING 表示没有动作.因此一个 DO INSTEAD NOTHING 规则制止了原来的查询的运行(当条件为真时) DO NOTHING 规则是没有用的.

规则的 action 部分 执行的时候带有和触发动作的用户命令相同的命令和事务标识符.

规则和视图

目前ON SELECT 规则必须是无条件的 INSTEAD 规则并且 必须有一个由一条 SELECT 查询组成的动作.因此一条 ON SELECT 规则有效地把对象表转成视图它的可见内容 是规则的 SELECT 查询返回的记录而不是存储在表中的内容(如果有的话). 我们认为写一条 CREATE VIEW 命令比创建一个表然后定义一条 ON SELECT 规则在上面的风格要好.

CREATE VIEW 创建一个虚拟表(没有下层的存储) 以及相关的 ON SELECT 规则.系统不允许对视图进行更新 因为它知道在视图上没有真正的表.你可以创建一个可以更新的视图的幻觉 方法是在视图上定义 ON INSERTON UPDATE和 ON DELETE 规则 (或者满足你需要的任何上述规则的子集)用合适的对其它表的更新替换 在视图上更新的动作.

如果你想在视图更新上使用条件规则那么这里就有一个补充∶ 对你希望在视图上允许的每个动作你都必须有一个无条件的 INSTEAD 规则.如果规则是有条件的或者它不是 INSTEAD 那么系统仍将拒绝执行更新动作的企图因为它认为它最终会在某种 程度上在虚拟表上执行动作. 如果你想处理条件规则上的所由有用的情况那也可以只需要增加一个无条件的 DO INSTEAD NOTHING 规则确保系统明白它将决不会被 调用来更新虚拟表就可以了.然后把条件规则做成非 INSTEAD 在这种情况下如果它们被触发那么它们就增加到缺省的 INSTEAD NOTHING 动作中.

注意

为了在表上定义规则你必须有规则定义权限. 用 GRANT 和 REVOKE 修改权限.

有一件很重要的事情是要避免循环规则. 比如尽管下面两条规则定义都是 PostgreSQL 可以接受的 select 命令会导致 PostgreSQL 报告 一条错误信息因为该查询循环了太多次

CREATE RULE bad_rule_combination_ AS

ON SELECT TO emp

DO INSTEAD

SELECT * FROM toyemp;

CREATE RULE bad_rule_combination_ AS

ON SELECT TO toyemp

DO INSTEAD

SELECT * FROM emp;

下面这个对 EMP 的查询企图将导致 PostgreSQL 产生一个错误信息 因为该查询循环了太多次

SELECT * FROM emp;

目前如果一个规则包含一个 NOTIFY 查询那么该 NOTIFY 将被 无条件执行 也就是说如果规则不施加到任何行上头该 NOTIFY 也会被发出.比如

CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;

UPDATE mytable SET name = foo WHERE id = ;

一个 NOTIFY 事件将在 UPDATE 的时候发出不管是否有某行的 id = .这是一个实现的限制将来的版本应该修补这个毛病.

兼容性 SQL

CREATE RULE语句是 PostgreSQL 语言的扩展. 在里没有CREATE RULE 语句.

CREATE SEQUENCE

CREATE SEQUENCE

Name

CREATE SEQUENCE 创建一个新的序列发生器

Synopsis

CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT increment ]

[ MINVALUE minvalue ] [ MAXVALUE maxvalue ]

[ START start ] [ CACHE cache ] [ CYCLE ]

输入

TEMPORARY 或 TEMP

如果声明了这个修饰词那么该序列对象只为这个会话创建 并且在会话结束的时候自动删除.在临时序列存在的时候 同名永久序列是不可见的(在同一会话里).

seqname

将要创建的序列号名.

increment

INCREMENT increment 子句是可选的.一个正数将生成一个递增的序列 一个负数将生成一个递减的序列.缺省值是一().

minvalue

可选的子句 MINVALUE minvalue 决定一个序列可生成的最小值.缺省分别是递增序列为 递减为 ^

maxvalue

使用可选子句 MAXVALUE maxvalue 决定序列的最大值.缺省的分别是递增为 ^递减为

start

可选的 START start 子句 使序列可以从任意位置开始.缺省初始值是递增序列为 minvalue 递减序列为 maxvalue

cache

CACHE cache 选项使序列号预分配并且为快速访问存储在内存里面. 最小值(也是缺省值)是(一次只能生成一个值 也就是说没有缓存).

CYCLE

可选的 CYCLE 关键字可用于使序列到达 最大值(maxvalue) 或 最小值(minvalue) 时可复位并继续下去.如果达到极限生成的下一个数据将分别是 最小值(minvalue) 或 最大值(maxvalue).如果没有 CYCLE那么在到达极限之后再调用 nextval 将返回错误.

输出

CREATE

命令成功执行的返回信息.

ERROR: Relation seqname already exists

如果声明的序列已经存在.

ERROR: DefineSequence: MINVALUE (start) cant be >= MAXVALUE (max)

如果声明的初始值超出范围返回此信息.

ERROR: DefineSequence: START value (start) cant be < MINVALUE (min)

如果声明的初始值超出范围返回此信息.

ERROR: DefineSequence: MINVALUE (min) cant be >= MAXVALUE (max)

如果最小值和最大值不连贯.

描述

CREATE SEQUENCE将向当前数据库里增加一个新的序列号生成器. 包括创建和初始化一个新的名为 seqname的 单行表.生成器将为使用此命令的用户所有

在序列创建后你可以使用函数 nextval currval 和 nextval 操作序列.这些函数在用户手册中有详细文档.

尽管你不能直接更新一个序列但你可以使用象

SELECT * FROM seqname;

检查一个序列的参数和当前状态.特别是序列的 last_value 字段显示了任意后端进程分配的最后的数值. (当然这些值在被打印出来的时候可能已经过时了 如果其它进程 正积极地使用 nextval.)

Caution

如果用语序列对象的cache 设置大于一 而且该对象可能被多个后端同时使用就有可能产生不可预料的结果.每个后端 在访问过序列对象并递增序列对象的 last_value 后 将分配跟在序列值后面缓存数.这样该后端在下面的 cache 次nextval调用将使用预分配好的数值 而不对共享对象做任何更新. 所以任何已经分配但在会话中没有使用的数字 将在会话结束时丢失.而且尽管多个后端保证分配独立的序列值 当考虑所有的后端时该数值却有可能是乱序的.(例如设置 cache为 后端 A 可能保留数值 并且返回nextval= 而后端 B 可能保留数值 并在后端 A 生成nextval= 之 前返回 nextval=.)因此 将cache 设为一可以安全地假设nextval的数值是顺序生成的 当缓存数设置大于一我 们只能假设nextval值都是独立的 而不能假设它们都是纯粹顺序生成的. 同样last_value将反映由任何后端保留的最 后数值不管它是不是nextval曾返回过的. 另外一个问题是在这样的序列上执行的 setval 将不会被 其它后端知晓直道它们用光所有预先分配的缓存数值.

注意

使用 DROP SEQUENCE 语句来删除序列.

序列是基于 bigint 运算的因此其范围不能超过八字节的 整数范围().在一些老一点的平台上可能没有对八字节整数的编译器支持 这种情况下序列使用普通的 integer 运算(范围是 到 +).

如果 cache 大于一那么每个后端使用其自身的缓存来存储分配的数字. 已分配但当前会话没有使用的数字将丢失导致序列里面出现空洞

用法

创建一个叫 serial的递增序列开始

CREATE SEQUENCE serial START ;

从此序列中选出下一个数字

SELECT nextval (serial);

nextval

在一个 INSERT 中使用此序列

INSERT INTO distributors VALUES (nextval(serial)nothing);

在一个 COPY FROM 后更新序列

BEGIN;

COPY distributors FROM input_file;

SELECT setval(serial max(id)) FROM distributors;

END;

兼容性 SQL

CREATE SEQUENCE是 PostgreSQL 语言扩展. 在里没有 CREATE SEQUENCE 语句.

CREATE TABLE AS

CREATE TABLE AS

Name

CREATE TABLE AS 从一条查询的结果中创建一个新表

Synopsis

CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [ ] ) ]

AS query

描述

CREATE TABLE AS创建一个表并且用来自 SELECT 命令计算出来的数据填充该表. 该表的字段和 SELECT 输出字段 的名字及类型相关.(只不过你可以通过明确地给出一个字段名字 列表来覆盖 SELECT 的字段名).

CREATE TABLE AS和创建视图有点象 不过两者之间实在是有比较大差异∶它创建一个新表并且只对 SELECT 计算一次来填充这个新表. 新表不能跟蹤 SELECT 的源表随后做的变化. 相比之下每次做查询的时候视图都重新计算 SELECT.

这条命令和 SELECT INTO有相同的功能 但是我们建议你多用这条命令因为它不象 SELECT INTO 语法那样融合和一些其它用法混淆.

参数

[LOCAL] TEMPORARY 或 [LOCAL] TEMP

如果声明了这个选项则该表作为临时表创建. 临时表在会话退出的时候自动删除 在该临时表存在的期间(本次会话) 同名的永久表是不可见的 任何在临时表上创建的索引也自动是临时的

LOCAL 关键字是可选的.

table_name

要创建的表名.这个表不能是已经存在的. 不过临时表可以创建为和现有永久表同名. (译注∶这里指的是同名临时表或永久表不能已经存在)

column_name

字段的名称.多字段的名称可以用逗号分隔的字段名列表声明. 如果没有提供字段名子那么就从查询的输出字段名中获取.

query

有效的查询语句(也就是一条 SELECT 命令)请参考 SELECT 获取可以使用的语法的描述.

诊断

请参考 CREATE TABLE和 SELECT 获取可能的输出的概要.

注意

这条命令从功能上等效于 SELECT INTO 但是我们更建议你用这个命令因为它不太可能和 SELECT INTO 语法的其它方面的使用混淆.

兼容性 SQL

这条命令是根据 Oracle 的一个特性 制作的.在 或 SQL 中没有功能相等的命令.不过 把CREATE TABLE 和 INSERT SELECT 组合起来可以通过略微多一些的工作完成同样的事情.

历史

自 PostgreSQL 开始就已经有 CREATE TABLE AS 命令了.

又见

CREATE TABLE CREATE VIEW SELECT SELECT INTO

               

上一篇:实现数据行的权限控制(Policy的应用)

下一篇:如何使用ADO访问Oracle数据库存储过程