postgresql 创建数据表。临时表
CREATE TABLENameCREATE TABLE--定义一个新表SynopsisCREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( { column_name data_type [ DEFAULT default_expr ] [ column_constraint [,... ] ] | table_constraint | LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] } [,... ] ) [ INHERITS ( parent_table [,... ] ) ] [ WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace ] 这里 column_constraint 可以是: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | UNIQUE [ USING INDEX TABLESPACE tablespace ] | PRIMARY KEY [ USING INDEX TABLESPACE tablespace ] | 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 [,... ] ) [ USING INDEX TABLESPACE tablespace ] | PRIMARY KEY ( column_name [,... ] ) [ USING INDEX TABLESPACE tablespace ] | 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 ] 描述CREATE TABLE将在当前数据库创建一个新的, 初始为空的表。该表将由发出此命令的用户所有。 如果给出了模式名(比如,CREATE TABLE myschema.mytable ...), 那么表是在指定模式中创建的。否则它在当前模式中创建。临时表存在于一个特殊的模式里, 因此创建临时表的时候不能给出模式名。表名字必需是在同一模式中其他表,序列,索引或者视图名字中唯一的。 CREATE TABLE还自动创建一个数据类型, 该数据类型代表对应该表一行的复合类型。 因此,表不能和同模式中的现有数据类型同名。 可选的约束子句声明约束(测试),新行或者更新的行必须满足这些约束才能成功插入或更新。 约束是一个它是一个 SQL 对象,它以多种方式协助我们协助我们在表上定义有效的数值集合。 定义约束又两种方法:表约束和列约束。一个列约束是作为一个列定义的一部分定义的。 而表约束并不和某个列绑在一起, 它可以作用于多于一个列上。每个列约束也可以写成表约束; 如果某个约束只影响一个列,那么列约束只是符号上的简洁方式而已。 参数
注意我们不建议在新应用中使用 OID,可能情况下,更好的选择是使用一个SERIAL或者其它序列发生器做表的主键。 如果一个应用使用了 OID 标识表中的特定行,那么我们建议在该表的oid字段上创建一个唯一约束,以确保该表的 OID 即使在计数器重叠之后也是唯一的。如果你需要一个整个数据库范围的唯一标识, 那么就要避免假设 OID 是跨表唯一的,你可以用tableoid和行 OID 的组合来实现这个目的。
PostgreSQL自动为每个唯一约束和主键约束创建一个索引以确保唯一性。 因此,我们不必为主键字段明确的创建索引。 (参阅CREATE INDEX获取更多信息。) 唯一约束和主键在目前的实现里是不能继承的。 这样,如果把继承和唯一约束组合在一起会导致无法运转。 一个表不能超过 1600 个字段。(实际上,实际的限制比这个更低, 因为还有远祖长度限制。) 例子创建表films和distributors: CREATE TABLE films ( code char(5) CONSTRAINT firstkey PRIMARY KEY,title varchar(40) NOT NULL,did integer NOT NULL,date_prod date,kind varchar(10),len interval hour to minute ); CREATE TABLE distributors ( did integer PRIMARY KEY DEFAULT nextval('serial'),name varchar(40) NOT NULL CHECK (name <> '') ); 创建一个带有 2 维数组的表: CREATE TABLE array_int ( vector INT[][] ); 为表films定义一个唯一表约束。 唯一表约束可以在表的一个或多个字段上定义: CREATE TABLE films ( code char(5),title varchar(40),did decimal(3),len interval hour to minute,CONSTRAINT production UNIQUE(date_prod) ); 定义一个检查列约束: CREATE TABLE distributors ( did integer CHECK (did > 100),name varchar(40) ); 定义一个检查表约束: CREATE TABLE distributors ( did integer,name varchar(40) CONSTRAINT con1 CHECK (did > 100 AND name <> '') ); 为表films定义一个主键表约束。 主键表约束可以定义在表上的一个或多个字段。 CREATE TABLE films ( code char(5),did integer,CONSTRAINT code_title PRIMARY KEY(code,title) ); 为表distributors定义一个主键约束。 下面两个例子是等效的,第一个例子使用了表约束语法, 第二个使用了列约束语法。 CREATE TABLE distributors ( did integer,name varchar(40),PRIMARY KEY(did) ); CREATE TABLE distributors ( did integer PRIMARY KEY,name varchar(40) ); 下面这个例子给字段name赋予了一个文本常量缺省值, 并且将字段did的缺省值安排为通过选择序列对象的下一个值生成。modtime的缺省值将是该行插入的时候的时间。 CREATE TABLE distributors ( name varchar(40) DEFAULT 'Luso Films',did integer DEFAULT nextval('distributors_serial'),modtime timestamp DEFAULT current_timestamp ); 在表distributors上定义两个NOT NULL列约束,其中之一明确给出了名字: CREATE TABLE distributors ( did integer CONSTRAINT no_null NOT NULL,name varchar(40) NOT NULL ); 为name字段定义一个唯一约束: CREATE TABLE distributors ( did integer,name varchar(40) UNIQUE ); 上面的和下面这样作为一个表约束声明是一样的: CREATE TABLE distributors ( did integer,UNIQUE(name) ); 在表空间diskvol1里创建表cinemas: CREATE TABLE cinemas ( id serial,name text,location text ) TABLESPACE diskvol1; 兼容性CREATE TABLE遵循 SQL-92 和 SQL:1999 的一个子集,一些例外情况在下面列出。 临时表尽管CREATE TEMPORARY TABLE的语法和 SQL 标准的类似, 但是效果是不同的。在标准里,临时表只是定义一次并且自动存在(从空内容开始)于任何需要它们的会话中。PostgreSQL要求每个会话为它们使用的每个临时表发出它们自己的CREATE TEMPORARY TABLE命令。 这样就允许不同的会话将相同的临时表名字用于不同的目的,而标准的实现方法则把一个临时表名字约束为具有相同的表结构。 标准定义的临时表的行为被广泛地忽略了。PostgreSQL在这方面上的行为类似于许多其它 SQL 数据库 标准中在全局和局部地临时表之间的区别在PostgreSQL里不存在,因为这种区别取决于模块的概念,而PostgreSQL没有这个概念。出于兼容考虑,PostgreSQL将接受临时表声明中的GLOBAL和LOCAL关键字, 但是他们没有作用。 临时表的ON COMMIT子句也类似于 SQL 标准, 但是有些区别。如果忽略了ON COMMIT子句,SQL 声明缺省的行为是ON COMMIT DELETE ROWS。 但是PostgreSQL里的缺省行为是ON COMMIT PRESERVE ROWS。 在 SQL 里不存在ON COMMIT DROP。 字段检查约束SQL 标准说CHECK字段约束只能引用他们施用的字段; 只有CHECK表约束才能引用多个字段。PostgreSQL并不强制这个限制;它把字段和表约束看作相同的东西。 NULL"约束"NULL"约束"(实际上不是约束)是PostgreSQL对 SQL 标准的扩展, 包括它是为了和其它一些数据库系统兼容(以及为了和NOT NULL约束对称)。 因为它是任何字段的缺省,所以它的出现只是噪音而已。 继承通过INHERITS子句的多重继承是PostgreSQL语言的扩展。 SQL:1999(但不包括 SQL-92)使用不同的语法和语义定义了单继承。 SQL:1999 风格的继承还没有在PostgreSQL中实现。 对象 IDPostgreSQL的 OID 的概念不是标准。 零行表PostgreSQL允许创建没有字段的表 (比如,CREATE TABLE foo();)。这是对 SQL 标准的扩展, 标准不允许存在零字段表。零字段表本身没什么用,但是禁止他们会给ALTER TABLE DROP COLUMN带来很奇怪的情况,所以,这个时候忽视标准的限制概念非常清楚。 表空间PostgreSQL的表空间概念不是标准的东西。 因此TABLESPACE和USING INDEX TABLESPACE都是扩展。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |