参看连接sql
PG建立表数据库
PG提供:普通表、临时表、无日志表、继承表、基于复合类型表、外部表spa
CREATE TABLE tb_products ( id integer, name text, price numeric );
CREATE TABLE tb_products ( id integer, name text, price numeric DEFAULT 9.99 --DEFAULT关键字,9.99是字段price的默认值。 ); CREATE TABLE tb_products ( id SERIAL, --SERIAL自增字段, autonumber name text, price numeric DEFAULT 9.99 );
DROP TABLE tb_products;
约束类型:外键约束、惟一性约束、检查约束、排他性约束日志
字段里的数值必须知足一个布尔表达式。此外,也能够声明表级别的检查约束。 code
CREATE TABLE tb_products ( id integer, name text, --price字段的值必须大于0,不然插入或修改该字段值,将引起错误。 --匿名约束,PostgreSQL将会根据当前的表名、字段名和约束类型, --为该约束自动命名,如:products_price_check。 price numeric CHECK (price > 0) ); CREATE TABLE tb_products ( id integer, name text, --显式约束,名为positive_price。 --好处:维护该约束时,可根据该名进行直接操做。 price numeric CONSTRAINT positive_price CHECK (price > 0) );
字段不能插入、更新为空值blog
CREATE TABLE tb_products ( id integer NOT NULL, name text NOT NULL, price numeric );
字段中存在多个约束,定义时不用考虑声明顺序。继承
CREATE TABLE tb_products ( id integer NOT NULL, name text NOT NULL, price numeric NOT NULL CHECK (price > 0) );
字段不能插入、更新为当前表中的已有值索引
CREATE TABLE tb_products ( id integer UNIQUE, name text, price numeric ); CREATE TABLE tb_products ( id integer, name text, price numeric, UNIQUE (product_no) );
CREATE TABLE example ( a integer, b integer, c integer, UNIQUE (a, c) );
CREATE TABLE tb_products ( id integer CONSTRAINT must_be_different UNIQUE, name text, price numeric );
在插入数据时,空值(NULL)之间被视为不相等的数据,所以对于某一惟一性字段,能够屡次插入空值。然而须要注意的是,这一规则并非被全部数据库都遵照,所以在进行数据库移植时可能会形成必定的麻烦。 事务
主键约束惟一约束和非空约束的组合ip
CREATE TABLE tb_products ( id integer PRIMARY KEY, --字段product_no被定义为该表的惟一主键。 name text, price numeric );
CREATE TABLE example ( a integer, b integer, c integer, PRIMARY KEY (b, c) );
CREATE TABLE orders ( order_id integer PRIMARY KEY, --主键。 --该表的id字段是外键,为products表主键(id)。 id integer FOREIGN KEY REFERENCES products(product_no), quantity integer ); CREATE TABLE t1 ( a integer PRIMARY KEY, b integer, c integer, --该外键的字段数量和被引用表中主键的数量必须保持一致。 FOREIGN KEY (b, c) REFERENCES example (b, c) );
当多个表存在主外键的参考性约束关系时。若是想删除被参照表某行记录,因为该行记录的主键字段值可能在参照表中某条记录所关联,因此删除操做将会失败。
CREATE TABLE tb_products ( pid integer PRIMARY KEY, name text, price numeric ); CREATE TABLE tb_orders ( order_id integer PRIMARY KEY, shipping_address text ); CREATE TABLE tb_order_items ( pid integer REFERENCES tb_products ON DELETE RESTRICT, --限制选项 order_id integer REFERENCES tb_orders ON DELETE CASCADE, --级联删除选项 quantity integer, PRIMARY KEY (pid, order_id) );
RESTRICT :禁止删除被引用的行。
NO ACTION :的意思是若是在检查约束的时候,若是还存在任何引用行,则抛出错误; 若是你不声明任何东西,那么它就是缺省的行为。(这两个选择的实际区别是,NO ACTION 容许约束检查推迟到事务的晚些时候,而 RESTRICT 不行。)
CASCADE :声明在删除一个被引用的行的时候,引用它的行也会被自动删除掉。 在外键字段上的动做还有两个选项: SET NULL 和 SET DEFAULT。 这样会致使在被引用行删除的时候,引用它们的字段分别设置为空或者缺省值。 请注意这些选项并不能让你逃脱被观察和约束的境地。好比,若是一个动做声明 SET DEFAULT,可是缺省值并不能知足外键,那么动做就会失败。
相似ON DELETE,还有ON UPDATE 选项,它是在被引用字段修改(更新)的时候调用的。可用的动做是同样的。
ALTER TABLE tb_products ADD COLUMN description text;
### 在新增字段时,能够同时给该字段指定约束。
ALTER TABLE tb_products ADD COLUMN description text CHECK(description <> '');
ALTER TABLE tb_products DROP COLUMN description;
若是该表为被参照表,该字段为被引用字段,那么上面的删除操做将会失败。若是要想在删除被引用字段的同时级联的删除其全部引用字段,能够采用下面的语法形式。
ALTER TABLE tb_products DROP COLUMN description CASCADE;
ALTER TABLE tb_products ADD CHECK(name <> ''); --增长一个表级约束 ALTER TABLE tb_products ADD CONSTRAINT some_name UNIQUE(pid);--增长命名的惟一性约束。 ALTER TABLE tb_products ADD FOREIGN KEY(pdt_grp_id) REFERENCES pdt_grps; --增长外键约束。 ALTER TABLE tb_products ALTER COLUMN pid SET NOT NULL; --增长一个非空约束。
ALTER TABLE tb_products DROP CONSTRAINT some_name;
对于显示命名的约束,能够根据其名称直接删除,对于隐式自动命名的约束,能够经过psql的\d tablename来获取该约束的名字。和删除字段同样,若是你想删除有着被依赖关系地约束,你须要用CASCADE。一个例子是某个外键约束依赖被引用字段上的惟一约束或者主键约束。如:
MyTest=# \d products
Table "public.products"
Column | Type | Modifiers
------------+---------+-----------
product_no | integer |
name | text |
price | numeric |
Check constraints:
"positive_price" CHECK (price > 0::numeric)
ALTER TABLE tb_products ALTER COLUMN product_no DROP NOT NULL;
ALTER TABLE tb_products ALTER COLUMN price SET DEFAULT 7.77;
ALTER TABLE tb_products ALTER COLUMN price DROP DEFAULT;
ALTER TABLE tb_products ALTER COLUMN price TYPE numeric(10,2);
ALTER TABLE tb_products RENAME COLUMN pid TO product_number;
ALTER TABLE tb_products RENAME TO items;
1、索引