知识大全 超详细sql大全(3)

Posted 函数

篇首语:不登高山,不知天之高也;不临深溪,不知地之厚也。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 超详细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

  可以是 SQL C 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

  

  

  这个例子通过调用一个用户创建的名为 funcs so (扩展名因平台而异)的共享库过程创建一个 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))

  );

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

  CREATE FUNCTION point(plex) RETURNS point

  AS /home/bernie/pgsql/lib/plex so plex_to_point

  LANGUAGE C;

  该函数的 C 声明可以是∶

  Point * plex_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() doesn t 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     |

  lanpiler   | text    |

  lanname   | lanispl | lanpltrusted | lanplcallfoid | lanpiler

   + + + +

  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 ]

  [ MUTATOR = _op ] [ NEGATOR = neg_op ]

  [ RESTRICT = res_proc ] [ JOIN = join_proc ]

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

  输入

  name

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

  func_name

  用于实现该操作符的函数

  lefttype

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

  righttype

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

  _op

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

  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 (( ) ( )) >>> MYBOXES description

  转换到

  MYBOXES description <<< box (( ) ( ))

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

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

  NOT MYBOXES description === box (( ) ( ))

  简化成

  MYBOXES description !== box (( ) ( ))

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

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

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

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

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

  MYBOXES description <<< box (( ) ( ))

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

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

  函数

  my_procedure_ (MYBOXES description box (( ) ( )) )

  和操作符

  MYBOXES description === box (( ) ( ))

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

  注意

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

  用法

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

  CREATE OPERATOR === (

  LEFTARG = box

  RIGHTARG = box

  PROCEDURE = area_equal_procedure

  MUTATOR = ===

  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 UPDATE DELETE 或 INSERT 之一.

  object

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

  condition

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

  query

  组成 action 的查询可以是任何 SQL SELECT INSERT UPDATE DELETE 或 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 attribute name 和 new attribute name 代替.

  规则的 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 INSERT ON UPDATE 和 ON DELETE 规则 (或者满足你需要的任何上述规则的子集) 用合适的对其它表的更新替换 在视图上更新的动作.

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

  注意

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

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

  CREATE RULE bad_rule_bination_ AS

  ON SELECT TO emp

  DO INSTEAD

  SELECT * FROM toyemp;

  CREATE RULE bad_rule_bination_ 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) can t be >= MAXVALUE (max)

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

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

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

  ERROR: DefineSequence: MINVALUE (min) can t 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 命令了.

  又见

cha138/Article/program/Oracle/201311/16722

相关参考

知识大全 详细讲解SQL Server索引的性能问题[3]

详细讲解SQLServer索引的性能问题[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 《活着》中家珍的人物分析 超详细

求《活着》中家珍的人物分析超详细!有着中国女性共有的优点:勤劳、善良、忍辱负重、任劳任怨及家庭观念特别强,但我们也不能否认,家珍依然是中国几千年封建社会压迫下的一位女性代表,她的身上依然体现著“嫁鸡随

知识大全 php curl选项列表(超详细)

本篇文章是对php中的curl选项列表进行了详细的分析介绍需要的朋友参考下   第一类对于下面的这些option的可选参数value应该被设置一个bool类型的值选项可选value值备注CU

知识大全 详细介绍SQL交叉表的实例

详细介绍SQL交叉表的实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很简单的一个东西见网上

知识大全 查看SQL Server数据表的详细信息

查看SQLServer数据表的详细信息  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  SELEC

知识大全 详细讲解SQL Server索引的性能问题[6]

详细讲解SQLServer索引的性能问题[6]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 详细讲解SQL Server索引的性能问题[5]

详细讲解SQLServer索引的性能问题[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 详细讲解SQL Server索引的性能问题[4]

详细讲解SQLServer索引的性能问题[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 详细讲解SQL Server索引的性能问题[2]

详细讲解SQLServer索引的性能问题[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 详细讲解SQL Server索引的性能问题[1]

详细讲解SQLServer索引的性能问题[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb