创建database

liaoxinxi@tbase /home/liaoxinxi/trunk $ createdb -e -E utf8 -O tbaseuser -U postgresql -T template0 tplbase
CREATE DATABASE tplbase OWNER tbaseuser ENCODING 'utf8' TEMPLATE template0;

-U postgresql是用户名,是需要的,否则就会用操作系统的用户名

-T template0采用模板0,创建数据库的过程就是复制数据库的过程,默认是template1,在template1的情况下,在创建数据后,在template1安装的东西会拷贝到根据template1创建的数据库,而template0则不存在这种情况,其实template0和1的内容是一样的。所以在psql恢复数据的时候很好。

CREATE DATABASE 实际上是通过拷贝一个现有的数据库进行工作的。 缺省时,它拷贝名字叫 template1 的标准系统数据库。 所以该数据库是创建新数据库的"模板"。如果你给 template1 增加对象,这些对象将被拷贝到随后创建的用户数据库中。 这样的行为允许节点对数据库中的标准套件进行修改。 比如,如果你把过程语言 PL/pgSQL 安装到 template1 里,那么你在创建用户数据库的时候它们就会自动可得,而不需要额外的动作。
系统里还有第二个标准的系统数据库,叫 template0。 这个数据库包含和 template1 一开始时一样的数据内容, 也就是说,只有你使用的版本的 PostgreSQL 标准的对象。在 initdb 之后,我们不应该对 template0 做任何修改。通过告诉 CREATE DATABASE 使用 template0 而不是 template1 进行拷贝, 你可以创建一个"纯净"的用户数据库,它不会包含任何 template1 里节点所特有的东西。 这一点在恢复 pg_dump 转储的时候是非常方便的: 转储脚本应该在一个纯洁的数据库中恢复以确保我们创建了被转储出的数据库中的正确内容, 而不和任何现在可能已经存在在 template1 中的附加物相冲突

配置数据库

$/etc/init.d/postgresql restart  

$psql tbase 直接进入tbase

1,
listen_addresses = 'localhost' postgresql.conf 设置本地可tcp链接
2,
/etc/postgresql/8.4/main/pg_hba.conf 设置可访问
local all postgres trust
 
    
进入数据库后 psql tbase
\password 设置数据库密码,我不知道在createdb使用的密码为什么不管用,一定得用这个才能链接上数据库
>>> db = psycopg2.connect(user='postgres',password='shengqi158',database='tbase', host='localhost')
>>>
 
    


\encoding
获取编码格式
当前client的编码
SHOW client_encoding;
对于一些已知的编码,在客户端和服务器端实现自动转码
\c - newuserl来切换用户,- 表示数据库不变 \c用于切换用户和数据库 \du 列出用户,\l列出数据库,
\d 回车将得到所有表
initdb 命令将会创建数据库族,--encoding=encoding指定服务端的编码,也可在创建数据库的时候指定encoding
如果服务器字符集是 SQL_ASCII, 服务器把字节值 0-127 的数值根据 ASCII 标准解析,而字节值未 128-255 的则当作未解析的字符,在大多数情况下,如果你使用了任何非 ASCII 数据,那么使用 SQL_ASCII 设置都是不明智的,因为 PostgreSQL 会无法帮助你转换或者校验非 ASCII 字符。就存在部分以16进制表示
SQL_ASCIIany (no conversion will be performed)


UTF8all supported encodings
对于服务器端采用utf8还是sql-ascii编码都不影响order by和like

show server_encoding 获取服务端编码
show client_encoding 获取客户端编码
character varying(4) 这个4是字符,不是字节数,
len(s) 测试的字节数
char(n) 则是指定长度,没填满的话填充空白,比较或者转换的时候那些空白字符不会被关注
varchar(n),不会填充空白
text,允许的最长字符达到1G
在性能上,postgre对这三种数据类型没有性能差异,其他的数据库系统可能有
一般想存储没有特定上限的字符串一般采用text

select name from student where name like '%sdu%';
数据库备份还原命令
pg_dump -h 164.82.233.54 -U tbaseuser databasename > databasename.bak
恢复:pg_restore -h localhost -U tbaseuser -d databasename < databasename.bak
-h 代表目标主机,localhost代表本地主机,-U 用户,-d数据库名
\h alter table 
insert into init_cmd(cmd, check_type, platform_id) values('su - root\npasswd', 'UNIX',5);
insert into param(quote,display,type,"desc") values('apache_conf_path','apache配置文件路径','text','apache的配置路径'); 
desc关键字,加双引号,后边的值必须是单引号(有的时候)
select * from pg_stat_activity;查看链接情况
alter database tbase RENAME TO tbase_ascii;
alter table template add column industry character(10);

Template Databases

liaoxinxi@tbase /home/liaoxinxi/trunk $ pg_dump -h localhost -U postgresql tbase > tbase.bak
liaoxinxi@tbase /home/liaoxinxi/trunk $ psql -d tbase -U tbaseuser< tbase.bak

psql -d tbase -U tbaseuser -f tbase.bak

pg_dump -h localhost -p 5432 -U tradesns -W -F c -b -v -f "/home/tradeworkwangbin/us2010.backup" us2010
恢复:pg_restore -h 192.168.0.100 -p 5432 -U postgres -W -d us2011 -v "/root/us2010.backup"

pg_dump -h localhost  -p 5432 -U tbaseuser tbase -F c -b -v -f tbase.bak

pg_restore -h localhost -p 5432 -d tbase -U tbaseuser tbase.bak

-F 压缩格式,c表示很灵活的格式 -b大对象,客户化格式的转储不是脚本,不能用于 psql

http://www.cnblogs.com/wangbin/archive/2009/08/14/1546009.html

为了支持远程访问(默认关闭),必须在pg_hba.conf(/usr/bin/pgsql/data)添加 
host all all 192.168.0.0/16 trust #该网段可信
然后在postgresql.conf添加listen_address = '*'
重启:pg_ctl restart -D /usr/bin/pgsql/data
ps -elf|grep post
netstat -anp|grep 5432
主键,外键,索引,唯一索引
主键,一个表的唯一标志,保证数据的唯一性,一般是让主键只干主键的事
外键,主要用于关联和限制,一般是外表的主键,也可以是unique约束,另外控制主表的插入,必须有相应的外键,另外外表的删除肯定会查询主表,如果还有的话是不能删除的,这就保证了依赖关系,但同时带来了效率的下降。
当一个表中引用另外一个表的主键时,这个时候这个主键就成了主表中的外键

数据库的约束有三种,实体完整性约束、参照完整性约束和用户自定义约束。

1.实体完整性约束指的是主键不能为空,如果主键为空了还怎么唯一标识一条记录。

2.参照完整性约束,即外键的约束,某一外键的值必须在它引用的主键字段中存在。如,学生表中专业编号属性的值,必须都存于专业信息表中的专业编号属性中。想一想也就明白了,一个学生(大学生)怎么可能属于一个不存在的专业。

3.用户自定义完整性约束,指的是一些用户自己设定的约束,例如字段是否可以为空,字段值的取值范围(如:人的性别只能取男、女)

创建表的时候就创建了索引,那个索引就是主键

索引的目的就是为了加快查询速度设立的

ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model)

on update cascade;

第一行是设置外键约束并命名,第二行则是设置本表的字段,第三行则是关联的外表的约束,

ON UPDATE CASCADE; 即在主表更新时,子表(们)产生连锁更新动作,似乎有些人喜欢把这个叫“级联”操作。:) CASCADE 外,还有 RESTRICT(禁止主表变更)、SET NULL(子表相应字段设置为空)

CREATE INDEX <索引的名字> ON tablename (列的列表);设置简单索引
CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);设置为一索引,只出现一次,还有多列索引,
ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);

数据库中主键和外键的设计原则

复合主键常常导致不良的外键

postgres@liaoxinxi-ThinkPad-SL400:/usr/bin$ createdb -e -E 'utf8' -T template0 -U postgres -w -O postgres tbase
CREATE DATABASE tbase OWNER postgres ENCODING 'utf8' TEMPLATE template0;

ident

增加unique约束:

tbase=# alter TABLE platform add constraint name_chk unique (name);
NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index "name_chk" for table "platform"
ALTER TABLE

去除外键:

tbase=# alter TABLE t_item DROP CONSTRAINT t_item_id_field_fkey;
ALTER TABLE


alter TABLE item ADD column user_id integer;

http://man.ddvip.com/database/PostgreSQL80zhref/index.html