CREATE TABLE

www.wohedb.com  中文数据库管理系统

CREATE TABLE

名字

CREATE TABLE  -- 创建一个表

语法

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( [
  { column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ]
    | table_constraint
    | LIKE parent_table [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES } ] ... }
    [, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace ]
 
column_constraint 是:
 
[ CONSTRAINT constraint_name ]
{ NOT NULL | 
  NULL | 
  UNIQUE index_parameters |
  PRIMARY KEY index_parameters |
  CHECK ( expression ) |
  REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
table_constraint 是:
 
[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) index_parameters |
  PRIMARY KEY ( column_name [, ... ] ) index_parameters |
  CHECK ( expression ) |
  FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
 
UNIQUEPRIMARY KEY约束中的index_parameters 是:
 
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace ]

描述

    CREATE TABLE命令创建一个新的表。新建的表的所有者将是执行建表命令的用户,如果指定了模式名(例如, CREATE TABLE myschema.mytable ...,新建的表将会被放在指定的模式下,否则将会被放在当前模式下。如果创建的是临时表,则不能指定模式名,因为临时表都存放在一个特殊的模式下。表名不能与数据库中已有的表、视图、序列和索引的名称相同。

    建表时可以同时指定表上的约束条件,约束条件决定了能够在表中存在的合法的数据的集合,表中新插入的数据和被更新的数据必须满足表上的约束条件。一共有两种约束:表约束和列约束。列约束只与某个列有关,表约束可以引用多个列。列约束是列的定义信息的一部分。列约束也可以写成表约束的形式。

    该命令会自动在数据库中创建一个与表名同名的复合数据类型,该类型由表中的每个列的数据库类型组成。所以表名也不能与存放该表的模式下面已有的数据类型的名称相同。

 

参数

TEMPORARYTEMP

TEMPORARYTEMP表示新建立的表将是一个临时表,临时表在会话结束时会被自动删除,也可以在事务结束时被删除(通过ON COMMIT子句来设置),在临时表上创建的索引也是临时的。当前会话中已经存在的永久表若与临时表同名,则该永久表将不可见,除非在引用该永久表时,在前面加上模式名。在TEMPORARYTEMP的前面也可以加上GLOBALLOCAL,加上GLOBALLOCAL没有任何意义。

 

table_name

被创建的表的名字(可以用模式修饰)。

 

column_name

表的列的名字。

 

data_type

列的数据类型。

 

DEFAULT default_expr

指明列的默认值,default_expr是一个表达式,该表达式中不能出现变量和子查询,也不能引用表中的其它列,而且它的数据类型也必须与列的数据类型相同向表中插入新的数据行而又没有指定某个列的值时,将使用该列的DEFAULT表达式的值作为它的值,如果该列没有定义DEFAULT表达式,则它的默认值是空值。

 

INHERITS ( parent_table [, ... ] )

该子句是可选的,用来指定新键的表继承的所有父表。INHERITS子句在子表与父表之间建立一个永久的联系,新建的表将自动包含所有的父表含有的列。如果父表的定义信息被修改,这些改变同样会被传播到子表中,在默认的情况下,对父表进行扫描时,子表中的数据也会被包含进来。如果同一个列出现在多个父表中,至少在两个父表中该列的数据类型不同或者该列上定义的约束条件不同,系统将会报错,否则系统将自动将父表中多个相同的列合并成一个列。如果子表中的列与父表中的列同名,而且两者的数据类型不同或者该列上定义的约束条件不同,系统也会报错,否则系统会自动将两个列合并成一个列。如果子表中的某个列指定了默认值,而该列也出现在父表中而且父表中该列被指定了其它默认值,则将以子表中指定的默认值为准,父表中定义的默认值将被忽略。如果子表中的某个列没有指定默认值,而该列也出现在一个或多个父表中而且不同的父表中定义的该列的默认值完全相同,则将以父表中定义的默认值为准,如果有两个父表中定义的该列的默认值不相同,系统将会报错。

 

LIKE parent_table [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES } ]

该子句也是可选的,它的功能与INHERITS子句类似,不同的是新建的表与父表之间没有任何联系,新建的表只是复制父表的列名、列的数据类型和列的not null约束到自己的定义中。只有在指定了INCLUDING DEFAULTS的情况下,父表中的列的DEFAULT表达式才会被复制到新建的表中,默认的情况下,不会复制父表中的列的DEFAULT表达到新建的表中。not null约束总是会被复制到新建的表中,只有在指定了INCLUDING CONSTRAINTS的情况下,父表中的列的CHECK约束才会被复制到新建的表中。只有在指定了INCLUDING INDEXES的情况下,父表中索引定义信息才会被复制到新建的表中。与INHERITS子句另外一个不同的地方是,如果同一个列或约束条件出现在多个父表中,系统会报错,新建的表中的列或约束条件同时出现在父表中,系统也会报错。

 

CONSTRAINT constraint_name

该子句是可选的,它定义表上的约束条件。constraint_name 是约束条件的名字,如果它被省略,系统将自动为约束条件生成一个名字。

 

NOT NULL

相关的列中不能接受空值。如果列没有指定NOT NULL,则该列可以接受空值。

 

NULL

相关的列可以接受有空值。这也是默认的行为。NULL子句只是为了同SQL标准兼容才提供的,在实际的应用中最好不要实用。

 

UNIQUE (列约束)
UNIQUE ( column_name [, ... ] ) (表约束)

UNIUQUE约束限定表中的一个或多个列上不能出现两个或两组相同的值。注意,两个空值是不相等的。

 

PRIMARY KEY (列约束)
PRIMARY KEY ( column_name [, ... ] ) (表约束)

PRIMARY KEY将表中的一个或多个列指定为表的关键字。组成关键字的列不接受空值。

 

CHECK ( expression )

指定CHECK约束条件。表达式只能引用表中的列,不能含有子查询也不能含有变量。

 

REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (列约束)
FOREIGN KEY ( column [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (表约束)

定义外键约束。如果refcolumn被省略,将使用reftable的主键作为被引用的列。在临时表和永久表之间不能定义外键约束。

 

MATCH子句指明引用列和被引用的列的匹配方式。一共有三种:MATCH FULLMATCH PARTIALMATCH SIMPLEMATCH FULL表示组成外键的所有的列要么都是空值,要么都不是空值。MATCH SIMPLE表示组成外键的某些列可以是空值,而其它的列不是空值。当前没有实现MATCH PARTIAL

 

当被引用的列中的数据发生改变时,引用列的数据也要发生一些变化。ON DELETE和 ON UPDATE子句控制在被引用的列中的数据发生改变时,如何修改引用列的数据。ON DELETE子句指明在被引用的表中的数据行被删除时,如何修改引用表中引用列的数据。ON UPDATE子句指明在被引用的表中被引用的列中的数据被更新时,如何修改引用表中引用列的数据。如果被引用的表中的数据行被更新,但被引用的列的数据没有被更新,不需要对引用列进行任何操作。ON DELETE和ON UPDATE子句中的action有下面几个选项:

(1)NO ACTION

报告一个错误,指出删除或更新操作会违反外键约束。如果约束被推迟检查,只有在真正检查约束条件时才会报错(如果此时,引用表中的相关的违反约束的引用列已经不存在了,则不会报错)。这是默认的行为。

(2)RESTRICT

报告一个错误,指出删除或更新操作会违反外键约束。它与NO ACTION相同,只是立即检查约束条件,不能推迟到以后再进行。

(3)CASCADE

删除任何引用表中引用被引用表中被删除的数据行的数据行,或者将引用列的值改成与被引用列的新的值一样的值。

(4)SET NULL

将引用列的设为空值。

(5)SET DEFAULT

将引用列的设为它们的默认值。

 

只有NO ACTION才能被延迟执行,其它操作都必须被立即执行。

 

如果被引用的列经常被更新,最好在引用列上建立索引,加快外键约束的执行。

 

DEFERRABLE
NOT DEFERRABLE

控制约束条件是否能被推迟检查。DEFERRABLE表示可以被推迟检查,NOT DEFERRABLE表示不可以被推迟检查,不能被推迟检查的约束条件会在每条语句执行的末尾被检查。可以被推迟检查的约束条件可以在事务结束时才被检查(使用SET CONSTRAINTS命令)。默认是NOT DEFERRABLE。只有外键约束才能使用这个子句。其它的约束不能使用这个子句。

 

INITIALLY IMMEDIATE
INITIALLY DEFERRED

对于DEFERRABLE类型的约束条件,这条语句指明默认的检查约束条件的时间。INITIALLY IMMEDIATE表示在语句执行的末尾检查约束条件,这也是默认的行为。INITIALLY DEFERRED表示在事务结束时才检查约束条件。

 

WITH ( storage_parameter [= value] [, ... ] )

设定表的存储参数,后面会详细介绍表的存储参数。另外,WITH子句中如包含OIDS=TRUE或OIDS表示表将包含系统列OID,OIDS=FALSE表示表将不包含系统列OID,默认的情况下,表不会包含系统列。如果表的某个父表具有系统列OID,则该表也会包含系统列OID(即使使用了OIDS=FALSE,也会包含系统列OID)。

 

WITH OIDS
WITHOUT OIDS

WITH OIDS表示表将包含系统列OIDWITHOUT OIDS表将不包含系统列OID,默认的情况下,表不会包含系统列OIDWITH OIDS等价于WITH (OIDS), WITHOUT OIDS等价于WITH (OIDS=FALSE)

 

ON COMMIT

控制事务结束以后临时表的行为。有三个选项:

(1)PRESERVE ROWS

没有特别的处理。这是默认的行为。

(2)DELETE ROWS

在事务结束时,删除表中的所有数据。

(3)DROP

在事务结束以后,删除临时表。

 

TABLESPACE tablespace

存放表中的数据的表空间的名字。如果没指定,使用default_tablespace,对以临时表,使用temp_tablespaces。

 

USING INDEX TABLESPACE tablespace

控制存放与UNIQUEPRIMARY KEY约束相关的自动创建的索引的数据的表空间。如果没指定,使用default_tablespace,对以临时表,使用temp_tablespaces。

 

 

存储参数

    WITH子句指定表和自动创建的索引(与UNIQU

 

 

 

http://www.54xue.com/man/PostgreSQL8.3/sql_command_manual/sql_create_table.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值