2007-08
24

今天更换公司的开发服务器时用到了这两条命令,做个记录先。

如何导出PostgreSQL数据库中的数据:

$ pg_dump -U postgres -d mydatabase -f dump.sql

导入数据时首先创建数据库再用psql导入:

$ createdb newdatabase
$ psql -d newdatabase -U postgres -f dump.sql


2007-01
05

Wordpress的官方文档对数据库的结构描述得并不充分,索性自己来分析一下。首先从整体结构入手。 下面是2.0.5版的数据库结构图(E-R图)。为了节约篇幅,这里仅列出了主键和外键。 图中菱形表示1:n的关系,白色部分为1,黑色部分为n。

wordpress-db-er-diagram.png

Wordpress共有10个表,按照功能大致分为四类。

  • user: 用户信息,包括wp_users表和wp_usermeta表。
  • post: 文章及评论信息,包括wp_posts、wp_postmeta、wp_comments、wp_post2cat以及wp_categories五个表。
  • link: 链接信息,包括wp_links表和wp_linkcategories表。
  • option: 全局设置信息,包括wp_options表。

个人认为这个数据库有两个冗余的地方。一个是wp_post2cat表中的主键rel_id,其实可以不要rel_id,而使用post_id和category_id两列作为主键; 另一个是wp_options表,option_id列为自动增长列,仅使用该列即可作为主键,而不需要option_id、blog_id、option_name三列联合做主键。

另外,表的命名规则也很有意思。基本规则总结如下:

  • 保存对象的基本属性,命名为 wp_objects,使用复数(如 wp_posts,wp_comments);
  • 保存对象的扩展属性,命名为 wp_objectmeta,使用单数(如wp_postmeta,wp_usermeta);
  • 多对多关系,命名为 wp_a2b,其中a和b分别为多对多关系两端的对象名的缩写(如wp_post2cat)。


2006-09
10

Oracle 10g2默认仅支持redhat enterprise系列和 SuSE 系列的几个版本的 Linux。 在 Ubuntu 上安装 Oracle 需要做些设置。下面是安装过程。

阅读全文 »

2006-06
13

Oracle管理中常用的SQL语句。
阅读全文 »


2006-06
13

Oracle使用过程中经常会用到的SQL语句。
阅读全文 »


2006-06
02

Oracle中试图对一个子查询进行更新时可能会出现ORA-01779错误。该错误的内容为:

ORA-01779: cannot modify a column which maps to a non-key-preserved table
阅读全文 »

2006-05
26

简单介绍一下使用tkprof工具调整Oracle SQL语句性能的方法。
阅读全文 »


2006-05
25

启动时不连接服务器。

sqlplus /nolog

连接服务器的命令:

connect username/password@hoststring

设置行宽为1000字符。

set line 1000

设置列group_name的宽度为30字符。

col group_name format a30

启动外部编辑器编辑sql语句。

ed

设置ed命令启动的外部编辑器为vim。

define _EDITOR=vim

使用Windows下的gvim作为编辑器时应当加上-f参数。

define _EDITOR="gvim -f"

设置每页显示200条记录。

set pagesize 200

登录时自动执行的SQL脚本。

$ORACLE_HOME/sqlplus/admin/glogin.sql

各个用户自己的登录脚本。Oracle会在执行完glogin.sql之后执行该文件。搜索顺序为:当前目录->$SQLPATH。

login.sql


2005-09
27

今天一个朋友问我,一个表有两个字段mac和ip,如何找出所有的mac相同而ip不同的记录?想了半天写出了下面的这个SQL语句。

mysql> select * from ip;
+-----+-----+
| mac | ip  |
+-----+-----+
| abc | 123 |
| def | 456 |
| ghi | 245 |
| abc | 678 |
| def | 864 |
| abc | 123 |
| ghi | 245 |
+-----+-----+
7 rows in set (0.00 sec)

mysql> SELECT  DISTINCT a.mac, a.ip
    -> FROM ip a, ip b
    -> WHERE a.mac = b.mac AND a.ip <> b.ip ORDER BY a.mac;
+-----+-----+
| mac | ip  |
+-----+-----+
| abc | 678 |
| abc | 123 |
| def | 864 |
| def | 456 |
+-----+-----+
4 rows in set (0.00 sec)


2005-06
03

NULL值不等于0,也不等于空,它表示该值不定。

任何运算(加减乘除、字符串连接等)的运算数中包括NULL值时,整个表达式的值即为NULL。使用单行函数对NULL值进行处理,得到的结果也为NULL(NVL等函数除外)。

但是NULL值的布尔运算结果并不一定是NULL,例外的情况为,FALSE AND NULL 结果为FALSE,TRUE OR NULL 结果为TRUE。这是因为在AND运算时只要有一个运算数为FALSE结果即为FALSE,即使另一个运算数为NULL,结果也是一定为FALSE的。反之OR运算中,只要有一个运算数为TRUE,结果即为TRUE。

分组函数均忽略NULL值。

排序时,NULL被看作是最大的值,即正序时NULL显示在最下方,逆序时NULL显示在最上方。

处理NULL值的函数有如下几个:

  • NVL(参数1, 参数2):如果参数1不为NULL,则返回参数1;如果参数1为NULL,则返回参数2
  • NVL2(参数1, 参数2, 参数3):如果参数1不为NULL,则返回参数2;如果参数1为NULL,则返回参数3。该函数的返回值的类型总是与参数2相同,当参数1为NULL时,Oracle会将参数3转换成参数2的数据类型之后再返回。
  • NULLIF(参数1, 参数2) :如果参数1等于参数2,则返回NULL;如果参数1不等于参数2,则返回参数1。
  • COALESCE(参数1, 参数2, ..., 参数n):返回参数1到参数n中第一个不为NULL的值。