主键约束只是唯一约束和非空约束的组合。所以,下面两个表定义是等价的:
CREATE TABLE products ( product_no integer UNIQUE NOT NULL, name text, price numeric );
CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric );
主键也可以约束多于一个字段;其语法类似于唯一约束:
CREATE TABLE example ( a integer, b integer, c integer, PRIMARY KEY (a, c) );
主键表示一个或多个字段的组合可以用于唯一标识表中的数据行。这是定义一个主键的直接结果。请注意:一个唯一约束( unique constraint )实际上并不能提供一个唯一标识,因为它不排除 NULL 。
一个表最多可以有一个主键(但是它可以有多个唯一和非空约束)。关系型数据库理论告诉我们,每个表都必须有一个主键。PostgreSQL 并不强制这个规则,但我们最好还是遵循它。
值得注意的是,SQLite中,主键是自动 增长的
在MySQLI中,需要加一个auto_increment 标志
在Postgres中,有一个专门的类型 叫做serial的,来表示自动增加
为每一行生成一个”序列号(serial number)“。在 PostgreSQL 里,通常是用类似下面这样的方法生成的:
CREATE TABLE products ( product_no integer DEFAULT nextval('products_product_no_seq'), ... );
这里的 nextval() 从一个序列对象(sequence object)提供后继的数值。这种做法非常普遍,以至于我们有一个专门的缩写用于此目的:
CREATE TABLE products ( product_no SERIAL, ... );
其实, 自动增加 字段是 default字段 的一种特殊情况
可以在创建表之后,再次创建sequence
CREATE SEQUENCE event_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; alter table event alter column id set default nextval('event_id_seq');
或者修改字段类型
ALTER TABLE event ALTER COLUMN id TYPE serial;
添加主键
ALTER TABLE charge ADD PRIMARY KEY (id);
http://www.postgresql.org/docs/8.2/static/sql-altertable.html