CREATE TABLE
CREATE TABLE
名称
CREATE TABLE — 创建一个新表

语法
CREATE [ TEMPORARY | TEMP ] TABLE table (
column type
[ NULL | NOT NULL ] [ UNIQUE ] [ DEFAULT value ]
[column_constraint_clause | PRIMARY KEY } [ ... ] ]
[, ... ]
[, PRIMARY KEY ( column [, ...] ) ]
[, CHECK ( condition ) ]
[, table_constraint_clause ]
) [ INHERITS ( inherited_table [, ...] ) ]
输入
TEMPORARY
此表只是为这次会话创建,并且在会话结束后自动删除。当临时表存在时,同名的永久表是不可见的。
table
将要创建的新表的名称.
column
列/字段名.
type
列/字段类型.这里可以包括数组的声明.请参考 PostgreSQL 用户手册 获取关于数据类型和数组的详细信息.
DEFAULT value
一个列/字段的缺省值.请参考 DEFAULT 子句获取更多信息.
column_constraint_clause
可选的列/字段约束子句,声明一系列完整性约束和测试,当对表进行更新或插入操作时必须满足这些约束条件才能成功.每个约束必须生成一个布尔式.尽管 SQL92 要求 column_constraint_clause 只用于指定某一行,Postgres 允许在一个列/字段的约束里面引用多个列.请参考列约束子句获取更多信息.
table_constraint_clause
可选的表(约束) CONSTRAINT 子句,声明一系列整合的约束,当对表进行更新或插入时必须满足这些约束.每个约束必须生成一个布尔表达式.可以对多列使用同一个约束.一个表只能声明一个 PRIMARY KEY 子句;PRIMARY KEY column (表约束)和 PRIMARY KEY (列/字段约束)是互斥的. 请参考表约束子句获取更多信息.
INHERITS inherited_table
可选的(继承)INHERITS 子句声明一系列表名,这个表将自动从这些表继承所有字段.如果任何继承域出现的次数超过一次,Postgres 将报告一个错误. Postgres 自动地允许所创建的表继承所有其父表的函数.
输出
CREATE
成功创建表后的返回信息.
ERROR
如果创建表失败,返回此信息.通常还跟随一些描述文本,例如:ERROR: Relation 'table' already exists 在运行时出现,因为所声明的表已经在数据库中存在.
ERROR: DEFAULT: type mismatched
如果缺省数值的类型和字段定义的类型不一样,返回此错误.

描述
CREATE TABLE 将向当前数据库中追加一个表.表将为执行命令者"所有".
每个 type 可以是简单类型,复合(集)类型或者一个数组类型。每个属性都可以声明为非空并且每个都可以有一个缺省值,用 DEFAULT 子句.声明。

注意:对于 Postgres v6.0,一个属性内的数组维数的一致性不是强制的。这一点在以后的版本中将改变。
可选的 INHERITS 子句声明一个表集合,所创建的表自动从这个表集合里的表继承所有字段。如果任何继承的字段出现次数多于一次,Postgres 报告一个错误。Postgres 自动允许所创建的表继承那些在继承分级中级别比它高的表的函数。函数的继承是根据公共 Lisp 对象系统(Common Lisp Object System (CLOS))的习惯进行的。
每个新表或表 table 自动被创建为一个类型。因此表中的一条或更多实例自动就是一个类型,因而可以用于 ALTER TABLE 或其他 CREATE TABLE 语句。

新表将作为一个没有初始值的堆创建.一个表可以有不超过1600(事实上,这是因为受字段大小必须小于8192字节的限制)列,但是这个限制在一些节点上可以通过配置降低.一个表不能和系统表同名.

DEFAULT 子句
DEFAULT value
输入
value
缺省的表达式值可以是:
一个文本值
一个用户函数
a (译注:?不会翻译)niladic function
输出


描述
DEFAULT 子句向某列赋一个初始值.(通过在 CREATE TABLE 语句里面定义).缺省值的类型必须和列/字段定义的数据类型.
一个 INSERT 操作如果包括一个没有缺省值的列/字段,这时如果没有显式地提供该/列字段的数据值,将用一个NULL代替.缺省的 literal 意味着缺省值是声明的常量.缺省的 niladic-function 或 user-function 意味着缺省值是在 INSERT 时声明的函数值.

有两类 (?)niladic 函数:

niladic USER
CURRENT_USER / USER
参阅 CURRENT_USER 函数
SESSION_USER
参阅 CURRENT_USER 函数
SYSTEM_USER
未实现
niladic datetime
CURRENT_DATE
参阅 CURRENT_DATE 函数
CURRENT_TIME
参阅 CURRENT_TIME 函数
CURRENT_TIMESTAMP
参阅 CURRENT_TIMESTAMP 函数

用法
给列/字段 did 和 number 赋予一个常量值作为缺省值,一个字串赋予列/字段 did:
CREATE TABLE video_sales (
did VARCHAR(40) DEFAULT 'luso films',
number INTEGER DEFAULT 0,
total CASH DEFAULT '$0.0'
);
将一个现有的序列作为列did 的缺省值,并且给列/字段 name 一个字符串值:
CREATE TABLE distributors (
did DECIMAL(3) DEFAULT NEXTVAL('serial'),
name VARCHAR(40) DEFAULT 'luso films'
);
列/字段 CONSTRAINT 子句
[ CONSTRAINT name ] { [
NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECK constraint | REFERENCES
reftable
(refcolumn)
[ MATCH matchtype ]
[ ON DELETE action ]
[ ON UPDATE action ]
[ [ NOT ] DEFERRABLE ]
[ INITIALLY checktime ] }
[, ...]
输入
name
赋予整个约束的任意名称.如果没有声明 name ,将从表和列名称中生成一个唯一的名称用于 name.
NULL
列允许包含 NULL 值。这是缺省值。
NOT NULL
列不允许包含 NULL 值.与包含 CHECK 的列/字段相同(column NOT NULL).
UNIQUE
列/字段必须有一个唯一值.在 Postgres 这是通过在表上隐含地创建一个唯一索引实现的.
PRIMARY KEY
本列是一个主键,暗示着其唯一性是由系统强制提供的而且其他表可能依赖此列/字段作为行标识.请参考 PRIMARY KEY 获取更多的信息.
constraint
约束的定义.

描述
可选的约束子句声明某种约束或者测试,当进行插入或者更新操作时,新的或者更新的记录必须满足这个约束或测试时操作才能成功。每个约束必须得出一个布尔表达式。多个字段/属性可以在一个约束里面引用。作为表约束的 PRIMARY KEY 的使用是与作为列约束的 PRIMARY KEY 互相冲突不可兼容的。
约束是一个命名的规则:它是一个 SQL 对象,它通过对 INSERT,UPDATE 或 DELETE 等对基本表的操作结果进行限制,进而可以获得有效的结果集.

有两种方法定义整合约束:表约束(随后提到),列/字段约束(将在这里说明).

一个列/字段约束是作为列定义的一部分定义的一个整合约束,而且逻辑上一旦创建就会成为表约束.可用的列约束:

PRIMARY KEY
REFERENCES
UNIQUE
CHECK
NOT NULL


NOT NULL 约束
[ CONSTRAINT name ] NOT NULL
NOT NULL 约束表明一个列只能包含非空(non-null)数值的规则.NOT NULL 约束只是一个列约束,不允许作为一个表约束.
输出
status
ERROR: ExecAppend: Fail to add null value in not null attribute "column".
当试图向一个有 NOT NULL 约束的列插入一个空值时返回此运行时错误.
描述
用法
在表 distributors 上定义两个(非空)NOT NULL 列约束,其中一个是命名约束:
CREATE TABLE distributors (
did DECIMAL(3) CONSTRAINT no_null NOT NULL,
name VARCHAR(40) NOT NULL
);
UNIQUE 约束
[ CONSTRAINT name ] UNIQUE
输入
CONSTRAINT name
赋予一个约束的任意标记.

输出
status
ERROR: Cannot insert a duplicate key into a unique index.
如果试图向列/字段中插入一个重复数值,返回此运行时错误.

描述
UNIQUE 约束表明一个这样的规则:表中一组由一个或多个独立列组成的集合中只能包含一个唯一的数值.
一个列/字段定义包含了 UNIQUE 约束,不一定要包含 NOT NULL 约束.在一个没有NOT NULL 约束的列/字段列如果有多个空值并不违反 UNIQUE 约束.(这与 SQL92 定义不一致,但却是更有意义的习惯. 请参阅兼容性部分获取更多细节.)

每个 UNIQUE 列约束必须赋予一个该表中没有被其他 UNIQUE 或 PRIMARY KEY 约束定义过的列/字段上.

注意: Postgres 自动为每个 UNIQUE 约束创建一个唯一索引,以保证数据完整性.请参阅 CREATE INDEX 获取更多信息.
用法
为表 distributors 定义一个 UNIQUE 列约束. UNIQUE 列约束只能给表中一个列定义:
CREATE TABLE distributors (
did DECIMAL(3),
name VARCHAR(40) UNIQUE
);
与下面的表约束相同:
CREATE TABLE distributors (
did DECIMAL(3),
name VARCHAR(40),
UNIQUE(name)
);
CHECK (检查)约束
[ CONSTRAINT name ] CHECK
( condition [, ...] )
输入
name
赋予约束的任意名称.
condition
任何产生一个布尔值的有效的条件表达式.

输出
status
ERROR: ExecAppend: rejected due to CHECK constraint "table_column".
如果试图向列/字段中插入一个违反 CHECK 约束的数值,生成此运行时错误.

描述
CHECK 约束声明一个列中允许的数据的限制. CHECK 约束也可以做表约束.
SQL92 CHECK 列约束只能对表中的一列/字段进行定义或使用.Postgres没有这个限制.


PRIMARY KEY 约束
[ CONSTRAINT name ] PRIMARY KEY
输入
CONSTRAINT name
约束的任意名称.

输出
ERROR: Cannot insert a duplicate key into a unique index.
当你试图向一个有PRIMARY KEY 约束的列插入一个重复的数值时,将返回这个运行时信息.
描述
PRIMARY KEY 列约束表明表中的一个列/字段只能包含唯一的(不重复),非空的数值.在该列/字段的PRIMARY KEY 约束定义中不需要显式的包括NOT NULL 约束.
一个表只能声明一个 PRIMARY KEY.

注意
Postgres 自动创建一个唯一索引以保证数据的完整性.(参阅 CREATE INDEX 语句)
在同一个表中 PRIMARY KEY 约束定义的列应该应该和其他定义了 UNIQUE 约束的列不同名(不是同一列).因为这会导致等价索引的重复和增加不必要的处理.然而,Postgres 并没有明文禁止这些.

REFERENCES 约束
[ CONSTRAINT name ] REFERENCES reftable [ ( refcolumn ) ]
[ MATCH matchtype ]
[ ON DELETE action ]
[ ON UPDATE action ]
[ [ NOT ] DEFERRABLE ]
[ INITIALLY checktime ]
REFERENCES (参考)约束声明了一个规则:一个字段的数值要与另外一个字段的数值做对比检查.REFERENCES 还可以做为一个 FOREIGN KEY 表约束的一部分声明.

输入
CONSTRAINT name
约束的任意名称.
reftable
包含对比检查数据的表的名称.
refcolumn
reftable 里要做对比检查的字段名称.如果没有声明,使用表 reftable 的 PRIMARY KEY.
MATCH matchtype
有三种匹配类型:MATCH FULL,MATCH PARTIAL 和一种缺省的匹配类型(如果什么都没有声明的话).除非所有的外键字段都是 NULL,否则 MATCH FULL 将不允许一个多列/字段外键的某个列为 NULL.缺省的 MATCH 类型是允许某些外键字段是 NULL 而其他部分的外键字段不是 NULL.MATCH PARTIAL 目前不支持.
ON DELETE action
当一个参考表里的参考行要被删除时,要处理的动作.有下列动作.
NO ACTION
如果违反外键则产生错误.这是缺省.
RESTRICT
与 NO ACTION 相同.
CASCADE
删除任何引用参考行的行.
SET NULL
把参考列的值设为 NULL.
SET DEFAULT
把参考列的值设置为它们的缺省值.
ON UPDATE action
当一个参考表里的参考列要被更新时,要处理的动作.如果行被更新而参考列没有改变,不发生任何动作.有下面动作.
NO ACTION
如果违反外键则产生错误.这是缺省.
RESTRICT
与 NO ACTION 相同.
CASCADE
把参考列的值更新为被参考列的新值.
SET NULL
把参考列的值设置为 NULL.
SET DEFAULT
把参考列的值设置为缺省值.
[ NOT ] DEFERRABLE
这个选项控制该约束是否可以推迟到事务的结尾.如果 DEFERRABLE,SET CONSTRAINTS ALL DEFERRED 将导致只是在事务的结束时才检查外键.缺省是否NOT DEFERRABLE.

INITIALLY checktime
checktime 有两个可能的值用以声明检查约束的缺省时间.
DEFERRED
只在事务结尾检查约束.
IMMEDIATE
在每条语句(结尾)检查约束.这是缺省.
输出
status
ERROR: name referential integrity violation - key referenced from table not found in reftable
如果某人试图把一个数值插入到一个列中,而该列在被参考的表中没有匹配列,则生成这条运行时错误.
描述
REFERENCES 列约束指明一个表的某列必须只能包含匹配一个被参考表的某参考列的数据的数值.
向这个列追加的数值使用给出的匹配类型与被参考表的参考列进行匹配.另外,当被参考列的数据被修改,动作是对该列的当前数据进行比较.

注意
目前 Postgres 只支持 MATCH FULL 和一个缺省的匹配类型.另外,被参考表里的被参考列应该是一个有 UNIQUE 约束的列,不过 Postgres 并没有强制这一点.
表(约束) CONSTRAINT 子句
[ CONSTRAINT name ] { PRIMARY KEY | UNIQUE } ( column [, ...] )
[ CONSTRAINT name ] CHECK ( constraint )
[ CONSTRAINT name ] FOREIGN KEY ( column [, ...] )
REFERENCES reftable
(refcolumn [, ...] )
[ MATCH matchtype ]
[ ON DELETE action ]
[ ON UPDATE action ]
[ [ NOT ] DEFERRABLE ]
[ INITIALLY checktime ]
输入
CONSTRAINT name
完整性约束的任意名称.
column [, ...]
用于定义唯一索引,或 PRIMARY KEY,或 NOT NULL 约束的列/字段名.
CHECK ( constraint )
要作为约束进行估值的布尔表达式.

输出
表约束子句的可能输出和对应的列/字段约束的输出一样.
描述
表约束是对一个基本表的一个或多个列/字段定义的完整性约束."表约束"的四个元素是:

UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY

UNIQUE 约束
[ CONSTRAINT name ] UNIQUE ( column [, ...] )
输入
CONSTRAINT name
赋予约束的任意名称.
column
某表中的列/字段名.

输出
status
ERROR: Cannot insert a duplicate key into a unique index
如果试图向列中插入一个重复的值,将返回此错误.

描述
UNIQUE 约束表明表中由一个或若干个独立的列/字段组成的集合只能包含唯一的数值.表的 UNIQUE 约束和对应的列/字段约束的特性是一样的,区别是表约束可以跨越多个列/字段.
请参考列/字段的 UNIQUE 约束获取更多细节.

用法
给一个表 distributors 定义一个 UNIQUE 表约束:
CREATE TABLE distributors (
did DECIMAL(03),
name VARCHAR(40),
UNIQUE(name)
);
PRIMARY KEY 约束
[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] )
输入
CONSTRAINT name
赋予约束的任意名称.
column [, ...]
表中的一个或者多个列.

输出
status
ERROR: Cannot insert a duplicate key into a unique index.
如果试图向一个有 PRIMARY KEY 约束的表中插入重复值,返回这个运行时命令。
描述
PRIMARY KEY 约束表明某个表的由一个或多个列/字段组成的集合只能包含唯一,(不重复),非空数值.对声明的列定义的 PRIMARY KEY 约束不需要包括 NOT NULL 约束.
PRIMARY KEY 表约束与列/字段约束相似,区别是它具有控制多列/字段的能力.


请参考 PRIMARY KEY 列/字段约束部分获取更多信息.

REFERENCES (参考)约束
[ CONSTRAINT name ] FOREIGN KEY ( column [, ...] )
REFERENCES reftable [ ( refcolumn [, ...] ) ]
[ MATCH matchtype ]
[ ON DELETE action ]
[ ON UPDATE action ]
[ [ NOT ] DEFERRABLE ]
[ INITIALLY checktime ]
REFERENCES (参考)约束声明了一个规则:一个字段的数值要与另外一个字段的数值做对比检查.REFERENCES 还可以做为一个 FOREIGN KEY 表约束的一部分声明.
输入
CONSTRAINT name
约束的任意名称.
column [, ...]
表中的一个或者多个列的名称.
reftable
包含对比检查数据的表的名称.
referenced column [, ...]
reftable 里要做对比检查的一个或多个字段的名称.如果没有声明,使用表 reftable 的 PRIMARY KEY.
MATCH matchtype
有三种匹配类型:MATCH FULL,MATCH PARTIAL 和一种缺省的匹配类型(如果什么都没有声明的话).除非所有的外键字段都是 NULL,否则 MATCH FULL 将不允许一个多列/字段外键的某个列为 NULL.缺省的 MATCH 类型是允许某些外键字段是 NULL 而其他部分的外键字段不是 NULL.MATCH PARTIAL 目前不支持.
ON DELETE action
当一个被参考表里的被参考行要被删除时,要处理的动作.有下列动作.

NO ACTION
如果违反外键则产生错误.这是缺省.
RESTRICT
与 NO ACTION 相同.
CASCADE
删除任何引用参考行的行.
SET NULL
把参考列的值设为 NULL.
SET DEFAULT
把参考列的值设置为它们的缺省值.
ON UPDATE action
当一个被参考表里的被参考列要更新时,要处理的动作.如果行被更新而参考列没有改变,不发生任何动作.有下面动作.
NO ACTION
如果违反外键则产生错误.这是缺省.
RESTRICT
不允许被参考的列的更新.
CASCADE
把参考列的值更新为被参考列的新值.
SET NULL
把参考列的值设置为 NULL.
SET DEFAULT
把参考列的值设置为缺省值.
[ NOT ] DEFERRABLE
这个选项控制该约束是否可以推迟到事务的结尾.如果 DEFERRABLE,SET CONSTRAINTS ALL DEFERRED 将导致只是在事务的结束时才检查外键.缺省是否NOT DEFERRABLE.

INITIALLY checktime
checktime 有两个可能的值用以声明检查约束的缺省时间.

IMMEDIATE
在每条语句(结尾)检查约束.这是缺省.
DEFERRED
只在事务结尾检查约束.

输出
status
ERROR: name referential integrity violation - key referenced from table not found in reftable
如果某人试图把一个数值插入到一个列中,而该列在被参考的表中没有匹配列,则生成这条运行时错误.
描述
FOREIGN KEY 约束声明一个规则:某表的一个或多个独立列的组与被参考表中的一组独立列相关.
FOREIGN KEY 表约束与相当的列约束相似,只是多了控制多列/字段的能力.

参考关于 FOREIGN KEY 列约束的内容获取更多信息.

用法
创建表 films 和表 distributors :
CREATE TABLE films (
code CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY,
title CHARACTER VARYING(40) NOT NULL,
did DECIMAL(3) NOT NULL,
date_prod DATE,
kind CHAR(10),
len INTERVAL HOUR TO MINUTE
);
CREATE TABLE distributors (
did DECIMAL(03) PRIMARY KEY DEFAULT NEXTVAL('serial'),
name VARCHAR(40) NOT NULL CHECK (name <> '')
);
创建一个有2维数组的表:
CREATE TABLE array (
vector INT[][]
);
给 films 表定义一个 UNIQUE 表约束.UNIQUE 可以定义在表的一个或多个列/字段上:
CREATE TABLE films (
code CHAR(5),
title VARCHAR(40),
did DECIMAL(03),
date_prod DATE,
kind CHAR(10),
len INTERVAL HOUR TO MINUTE,
CONSTRAINT production UNIQUE(date_prod)
);
定义一个 CHECK 列约束:
CREATE TABLE distributors (
did DECIMAL(3) CHECK (did > 100),
name VARCHAR(40)
);
定义一个 CHECK 表约束:
CREATE TABLE distributors (
did DECIMAL(3),
name VARCHAR(40)
CONSTRAINT con1 CHECK (did > 100 AND name > '')
);
为表 films 定义一个 PRIMARY KEY 表约束.PRIMARY KEY 表约束可以对一个或多个列/字段进行定义:
CREATE TABLE films (
code CHAR(05),
title VARCHAR(40),
did DECIMAL(03),
date_prod DATE,
kind CHAR(10),
len INTERVAL HOUR TO MINUTE,
CONSTRAINT code_title PRIMARY KEY(code,title)
);
为表 distributors 定义一个 PRIMARY KEY 列约束. PRIMARY KEY 列约束只能对表中的一个列/字段定义.(下面两个例子是相当的 ):
CREATE TABLE distributors (
did DECIMAL(03),
name CHAR VARYING(40),
PRIMARY KEY(did)
);
CREATE TABLE distributors (
did DECIMAL(03) PRIMARY KEY,
name VARCHAR(40)
);
注意
CREATE TABLE/INHERITS 是 Postgres 语言扩展.

兼容性
SQL92
除了本地可见的临时表外,SQL92还定义了一条 CREATE GLOBAL TEMPORARY TABLE 语句,和一个可选的 ON COMMIT 子句:
CREATE GLOBAL TEMPORARY TABLE table ( column type [
DEFAULT value ] [ CONSTRAINT column_constraint ] [, ...] )
[ CONSTRAINT table_constraint ] [ ON COMMIT { DELETE | PRESERVE } ROWS ]
对于临时表,CREATE TEMPORARY TABLE 语句定义一个其他客户端可见的新表和定义表的列/字段和约束。
CREATE TEMPORARY TABLE 可选的 ON COMMIT 子句用于声明当 COMMIT 事务时,是否需要将临时表的行清空.如果 ON COMMIT 子句省略了,(缺省值),就假设为 ON COMMIT DELETE ROWS (当COMMIT时清空).

要创建一个临时表:

CREATE TEMPORARY TABLE actors (
id DECIMAL(03),
name VARCHAR(40),
CONSTRAINT actor_id CHECK (id < 150)
) ON COMMIT DELETE ROWS;
UNIQUE 子句
SQL92 对 UNIQUE 定义了一些附加的功能.
表约束定义:

[ CONSTRAINT name ] UNIQUE ( column [, ...] )
[ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ]
[ [ NOT ] DEFERRABLE ]
列/字段约束定义:
[ CONSTRAINT name ] UNIQUE
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
NULL 子句
NULL "约束" (实际上不是一个约束)是一个 Postgres 对SQL92的扩展,把它包含进来是为了和 NOT NULL 子句对称。因为这是任何列的缺省,它的出现只是添乱。
[ CONSTRAINT name ] NULL
NOT NULL 子句
SQL92 对 NOT NULL 声明了一些附加的功能:
[ CONSTRAINT name ] NOT NULL
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
CONSTRAINT 子句
SQL92 对约束声明了一些附加的功能,并且还定义了断言和域(domain)约束.
注意: Postgres 还不支持域(domain)和断言.
一个断言是一种特殊类型的完整性约束,并且和其他约束共享相同的名字空间(namespace).不过,一个断言不象约束那样必须依赖于某个基本表,所以 SQL-92 提供了一个 CREATE ASSERTION 语句作为定义约束的一个可选的手段:
CREATE ASSERTION name CHECK ( condition )
域约束是用 CREATE DOMAIN 或 ALTER DOMAIN 语句定义的:
域约束:

[ CONSTRAINT name ] CHECK constraint
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
表约束定义:
[ CONSTRAINT name ] { PRIMARY KEY ( column, ... ) | FOREIGN KEY constraint | UNIQUE constraint | CHECK constraint }
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINT name ] { NOT NULL | PRIMARY KEY | FOREIGN KEY constraint | UNIQUE | CHECK constraint }
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
一个 CONSTRAINT (约束)定义可以包含一个任意顺序的延迟属性的子句和/或一个初始化约束式子句.
NOT DEFERRABLE
意味着每条语句执行后都必须校验是否违反约束规则.SET CONSTRAINTS ALL DEFERRED 对这类约束没有影响.
DEFERRABLE
这个选项控制约束是否可以被推迟到事务的结束.如果使用了 SET CONSTRAINTS ALL DEFERRED 或者约束被设置成为 INITIALLY DEFERRED,将导致外键只在事务结束的时候检查.
SET CONSTRAINT 只为当前事务改变外键约束模式.
INITIALLY IMMEDIATE
只在事务结束的时候检查约束.这是缺省.
INITIALLY DEFERRED
在每条语句后检查约束.
CHECK 子句
SQL92 对 CHECK 声明了一些附加功能,不管是表约束还是列/字段约束.
表约束定义:

[ CONSTRAINT name ] CHECK ( VALUE condition )
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINT name ] CHECK ( VALUE condition )
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
PRIMARY KEY 子句
SQL92 为 PRIMARY KEY 声明了一些附加的功能:
表约束定义:

[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] )
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINT name ] PRIMARY KEY
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]

--------------------------------------------------------------------------------
上一页 首页 下一页
CREATE SEQUENCE 开头 CREATE TABLE AS

------

回复此文章 |
回复主题:Re:CREATE | 作者: haohao | 军衔:六级军士 | 发表时间:2004-07-11 23:12:32
SQL 语法参考手册
(加入时间:2002-1-4 点击数:23595)
转载:动网先锋

  一、资料定义ddl(data definition language)

  资料定语言是指对资料的格式和形态下定义的语言,他是每个资料库要建立时候时首先要面对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。

  1、建表格:

  create table table_name( column1 datatype [not null] [not null primary key], column2 datatype [not null],...)

  说明: 

  datatype --是资料的格式,详见表。
  nut null --可不可以允许资料有空的(尚未有资料填入)。
  primary key --是本表的主键。

  2、更改表格 

  alter table table_name add column column_name datatype

  说明:增加一个栏位(没有删除某个栏位的语法。)

  lter table table_name add primary key (column_name)

  说明:更改表得的定义把某个栏位设为主键。
  
  alter table table_name drop primary key (column_name)

  说明:把主键的定义删除。

  3、建立索引 

  create index index_name on table_name (column_name)

  说明:对某个表格的栏位建立索引以增加查询时的速度。

  4、删除 

  drop table_name

  drop index_name

  二、资料形态 datatypes

  smallint
  16 位元的整数。

  interger
  32 位元的整数。

  decimal(p,s)
  p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。

  float
  32位元的实数。

  double
  64位元的实数。

  char(n)
  n 长度的字串,n不能超过 254。

  varchar(n)
  长度不固定且其最大长度为 n 的字串,n不能超过 4000。

  graphic(n)
  和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为支援两个字元长度的字体,例如中文字。

  vargraphic(n)
  可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。

  date
  包含了 年份、月份、日期。

  time
  包含了 小时、分钟、秒。

  timestamp
  包含了 年、月、日、时、分、秒、千分之一秒。
三、资料操作 dml(data manipulation language)

  资料定义好之後接下来的就是资料的操作。资料的操作不外乎增加资料(insert)、查询资料(query)、更改资料(update) 、删除资料(delete)四种模式,以下分 别介绍他们的语法:

  1、增加资料:

  insert into table_name (column1,column2,...) values ( value1,value2, ...)

  说明:

  1.若没有指定column 系统则会按表格内的栏位顺序填入资料。

  2.栏位的资料形态和所填入的资料必须吻合。

  3.table_name 也可以是景观 view_name。

  insert into table_name (column1,column2,...) select columnx,columny,... from another_table

  说明:也可以经过一个子查询(subquery)把别的表格的资料填入。

  2、查询资料:

  基本查询

  select column1,columns2,... from table_name

  说明:把table_name 的特定栏位资料全部列出来

  select * from table_name where column1 = xxx [and column2 > yyy] [or column3 <> zzz]

  说明:

  1.'*'表示全部的栏位都列出来。

  2.where 之後是接条件式,把符合条件的资料列出来。

  select column1,column2 from table_name order by column2 [desc]

  说明:order by 是指定以某个栏位做排序,[desc]是指从大到小排列,若没有指明,则是从小到大排列

  组合查询

  组合查询是指所查询得资料来源并不只有单一的表格,而是联合一个以上的表格才能够得到结果的。

  select * from table1,table2 where table1.colum1=table2.column1

  说明:

  1.查询两个表格中其中 column1 值相同的资料。


  2.当然两个表格相互比较的栏位,其资料形态必须相同。

  3.一个复杂的查询其动用到的表格可能会很多个。

  整合性的查询:

  select count (*) from table_name where column_name = xxx

  说明:

  查询符合条件的资料共有几笔。

  select sum(column1) from table_name

  说明:

  1.计算出总和,所选的栏位必须是可数的数字形态。

  2.除此以外还有 avg() 是计算平均、max()、min()计算最大最小值的整合性查询。

  select column1,avg(column2) from table_name group by column1 having avg(column2) > xxx

  说明:

  1.group by: 以column1 为一组计算 column2 的平均值必须和 avg、sum等整合性查询的关键字一起使用。

  2.having : 必须和 group by 一起使用作为整合性的限制。

  复合性的查询

  select * from table_name1 where exists ( select * from table_name2 where conditions )

  说明:

  1.where 的 conditions 可以是另外一个的 query。

  2.exists 在此是指存在与否。

  select * from table_name1 where column1 in ( select column1 from table_name2 where conditions )

  说明: 

  1. in 後面接的是一个集合,表示column1 存在集合里面。

  2. select 出来的资料形态必须符合 column1。

  其他查询

  select * from table_name1 where column1 like 'x%'

  说明:like 必须和後面的'x%' 相呼应表示以 x为开头的字串。

  select * from table_name1 where column1 in ('xxx','yyy',..)

  说明:in 後面接的是一个集合,表示column1 存在集合里面。

  select * from table_name1 where column1 between xx and yy

  说明:between 表示 column1 的值介於 xx 和 yy 之间。

  3、更改资料:

  update table_name set column1='xxx' where conditoins

  说明:

  1.更改某个栏位设定其值为'xxx'。

  2.conditions 是所要符合的条件、若没有 where 则整个 table 的那个栏位都会全部被更改。

  4、删除资料:

  delete from table_name where conditions

  说明:删除符合条件的资料。

  说明:关于where条件后面如果包含有日期的比较,不同数据库有不同的表达式。具体如下:

  (1)如果是access数据库,则为:where mydate>#2000-01-01#

  (2)如果是oracle数据库,则为:where mydate>cast('2000-01-01' as date) 或:where mydate>to_date('2000-01-01','yyyy-mm-dd')

  在delphi中写成:

  thedate='2000-01-01';

  query1.sql.add('select * from abc where mydate>cast('+''''+thedate+''''+' as date)');


------

回复此文章 |
回复主题:Re:Re:CREATE | 作者: haohao | 军衔:六级军士 | 发表时间:2004-07-11 23:14:19
query = "Create table tablename ( id int(10) Not Null default "0" auto_increment, Primary Key(id) );";

hofman   2005-11-19 22:57:22 评论:0   阅读:3165   引用:0

发表评论>>

署名发表(评论可管理,不必输入下面的姓名)

姓名:

主题:

内容: 最少15个,最长1000个字符

验证码: (如不清楚,请刷新)

Copyright@2004-2010 powered by YuLog