燕之庐网站建设 - 优质网站设计公司

Posts Tagged ‘postgreSQL’

postgreSQL

2010/01/08

何为postgreSQL

Tags:

PostgreSQL是以 加州大学伯克利分校开发的 POSTGRES 版本 4.2为基础的 对象关系型数据库管理系统(ORDBMS)。 当初由 Michael Stonebraker 教授领导的 POSTGRES项目, 是由高级防务研究项目局 (Defense Advanced Research Projects Agency) (DARPA), 陆军研究处 ( Army Research Office (ARO), 国家科学基金会 (National Science Foundation) (NSF),和 ESL 公司赞助进行的。

PostgreSQL 是最初的伯克利 的代码的一个开放源码的继承人. 它提供了 SQL92/SQL99 语言的支持以及一些其他现代特性.

POSTGRES 所领先的许多 面向对象的概念现在已经在一些商业数据库中得到了应用. 传统的关系型数据库管理系统 (RDBMS) 支持一个由命名关系(表)的集合 (包括特定类型的属性/字段)组成的数据模型.在现代的商用系统中, 可能的类型通常包括浮点数,整数,字符串,金额及日期.现在, 人们普遍认为这个模型已经不能满足未来的数据处理应用的需要了. 而关系型模型成功地取代了以前的模型在某种程度上来说是因为它的 “简单”. 但是,这样的简单通常会使某些应用的实现变得非常困难. PostgreSQL 通过一种让用户可以很容易扩展系统的方法整合了下面四种基本概念, 使其能提供可观的附加功能:

  • 继承
  • 数据类型
  • 函数

其它特性则提供了附加的功能和灵活性∶

  • 约束
  • 触发器
  • 规则
  • 事务完整

这些特性将 PostgreSQL置于 对象-关系(object-relational)型数据库的范畴. 请注意,这是和那些所谓的 面向对象(object-oriented), 面向对象型数据库通常并不适合于支持传统的关系型数据库语言. 所以,尽管 PostgreSQL 有一些面向对象的特性,它仍然属于关系型数据库的范畴, 事实上,一些商用数据库最近已经集成了一些 PostgreSQL所领先的特性.

北京网站建设公司

postgreSQL

postgreSQL继承

Tags: ,

继承是面向对象的数据库的概念.它开启了数据库设计新的可能性大门.

让我们创建两个表∶一个表 cities 和一个表 capitals.自然,首府(capital)也可以是 城市(cities),因此在列出所有城市时你想要某种方法隐含地显示首府. 如果你已经很高明了,那么你可能会创造类似下面这样的大纲∶

CREATE TABLE capitals (
    name            text,
    population      real,
    altitude        int,    -- (单位是英尺)
    state           char(2)
);

CREATE TABLE non_capitals (
    name            text,
    population      real,
    altitude        int     -- (单位是英尺)
);

CREATE VIEW cities AS
    SELECT name, population, altitude FROM capitals
        UNION
    SELECT name, population, altitude FROM non_capitals;

如果只是查询,那么这个方法运转得很好,但是如果你需要更新某几行, 那这个方法就很难看了.

一种更好的方法是∶

CREATE TABLE cities (
    name            text,
    population      real,
    altitude        int     -- (单位是英尺)
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);

在这个例子里,capitals 的一行 继承所有来自它的父表cities的所有字段(namepopulation,和altitude). 字段 name 的类型是 text, 是 PostgreSQL 用于变长字符串的固有类型. 州首府有一个额外的字段,州,显示所处的州.在 PostgreSQL 里,一个表可以从零个或者更多其它 表中继承过来.

比如,下面的查询找出所有海拔超过 500 英尺的城市的名字, 包括州首府∶

SELECT name, altitude
    FROM cities
    WHERE altitude > 500;

它返回:

   name    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
 Madison   |      845
(3 rows)

另外一方面,下面的查询找出所有不是州首府并且位于 海拔大于或等于 500 英尺的城市∶

SELECT name, altitude
    FROM ONLY cities
    WHERE altitude > 500;
   name    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
(2 rows)

这里的 cities 前面的 ONLY 指示系统只对 cities 表运行查询,而不包括 继承级别中低于 cities 的表.许多我们已经 讨论过的命令 — SELECT, UPDATEDELETE — 支持这个 ONLY 表示法.

北京网站建设公司

postgreSQL

postgreSQL事务

Tags:

事务是所有数据库系统的一个基本概念. 一次事务的要点就是它把多个步骤捆绑成了一个单一的,不成功则成仁的操作. 其它并行的事务是看不到在这些步骤之间的中间状态的,并且如果发生了一些 问题,导致该事务无法完成,那么所有这些步骤都完全不会影响数据库.

比如,假设一个银行的数据库包含各种客户帐户的余额,以及每个分行的 总余额.假设我们要记录一次从 Alice 的帐户到 Bob 的帐户的金额为 $100.00 的支付动作.那么,完成这个任务的简单到极点的 SQL 命令象下面这样

UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
UPDATE branches SET balance = balance - 100.00
    WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Alice');
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
UPDATE branches SET balance = balance + 100.00
    WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Bob');

这些命令的细节在这儿并不重要;重要的是这里牵涉到了好几个独立 的更新来完成这个相当简单的操作.我们的银行官员会希望要么所有这些 更新都生效,要么全部不起作用.我们当然不希望一次系统崩溃就导致 Bob 收到 100 块不是 Alice 支付的钱,也不希望 Alice 老是不花钱从 Bob 那里拿到物品.我们需要保证∶如果在操作的过程中出了差错, 那么所有这些步骤都不会发生效果.把这些更新组合成一个 事务就给予我们这样的保证. 事务被认为是原子的∶从其它事务的角度来看, 它要么是全部发生,要么完全不发生.

我们还需要保证∶一旦一个事务完成并且得到数据库系统的认可, 那么它必须被真正永久地存储,并且不会在随后的崩溃中消失. 比如,如果我们记录到了一个 Bob 撤单的动作,那么我们不希望 仅仅在他走出银行大门之后的一次崩溃就会导致对他的帐户的 扣减动作消失.一个事务型数据库保证一个事务所做的所有更新 在事务发出完成响应之前都记录到永久的存储中(也就是磁盘).

事务型数据库的另外一个重要的性质和原子更新关系密切∶ 当多个事务并行地运行的时候,那么每个事务都不应看到其它事务 所做的未完成的变化.比如,如果一个事务正忙着计算所有分行的 余额总和,那么它不应该包括来自 Alice 的分行的扣帐和来自 Bob 分行的入帐,反之亦然.所以事务必须是黑白分明的,不仅仅体现在它们 在数据库上产生的永久影响出发,而且体现在它们运转时的自身的可视性上. 一个打开的事务做的更新在它完成之前是其它事务无法看到的,而且所有更新 是同时可见的.

PostgreSQL 里,一个事务是通过把SQL 命令用 BEGINCOMMIT 命令包围实现的. 因此我们的银行事务实际上看起来象下面这样

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
-- 等等
COMMIT;

如果在该事务的过程中,我们决定不做提交(可能是我们刚发现 Alice 的 余额是负数),那么我们可以发出 ROLLBACK 命令而不是 COMMIT 命令,那么到目前为止我们的所有更新都会被取消.

PostgreSQL 实际上把每个 SQL 语句当做在一个事务中 执行的来看待.如果你没有发出 BEGIN 命令,那么每个独立 的语句都有一个隐含的 BEGIN 和(如果成功的话) COMMIT 语句包围在周围.一组包围在 BEGINCOMMIT 语句中间的语句有时候被称做事务块

注意: 一些客户库自动发出 BEGINCOMMIT, 因此你可能不需要特意请求就可以获取事务块的效果.查看你使用的 接口的文档.


北京网站建设公司

postgreSQL

postgreSQL外键

Tags:

回忆一下 Chapter 2 里的 weathercities 表.考虑一下下面的问题∶你想确保没有人可以在 weather 表里插入一条在 cities 表里没有匹配记录的记录. 这就叫维护你的表的参考完整性. 在简单的数据库系统里,实现(如果也叫实现)这个特性的方法 通常是先看看 cities 表里是否有匹配的记录, 然后插入或者拒绝新的 weather 记录. 这个方法有许多问题,而且非常不便,因此 PostgreSQL 可以为你做这些.

新的表声明看起来会象下面这样∶

CREATE TABLE cities (
        city            varchar(80) primary key,
        location        point
);

CREATE TABLE weather (
        city            varchar(80) references cities,
        temp_lo         int,
        temp_hi         int,
        prcp            real,
        date            date
);

然后我们试图插入一条非法的记录∶

INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');
ERROR:  <unnamed> referential integrity violation - key referenced from weather not found in cities

外键的行为可以为你的应用仔细调节.在这份教程里我们就不再 多说了,而是请你参考PostgreSQL 7.3 用户手册获取更多的信息. 正确使用外键无疑将改进你的数据库应用,所以我们强烈建议你学习它们.

北京网站建设公司

postgreSQL, 产业新闻

postgreSQL视图

Tags: ,

回头看看在 Section 2.6 里的查询. 假设你的应用对天气记录和城市位置的列表特别感兴趣,而你 又不想每次键入这些查询.那么你可以在查询上创建一个 视图,它给你引用的查询一个普通表的感觉.

CREATE VIEW myview AS
    SELECT city, temp_lo, temp_hi, prcp, date, location
        FROM weather, cities
        WHERE city = name;

SELECT * FROM myview;

灵活使用视图是设计优良的 SQL 数据库的一个关键要素. 视图允许我们把表的细节封装起来,这些表可能因你的应用的变化而变化, 但是我们却可以通过视图给用户一个一致的接口.

视图几乎可以在一个真正的表可以使用的任何地方使用. 在其它视图上面再建造视图也是很常见的.

北京网站建设公司

postgreSQL

2010/01/07

postgreSQL-删除

Tags: ,

假设你对Hayward的天气不再感兴趣, 那么你可以用下面的方法把那些行从表中删除. 删除是用 DELETE 命令执行的∶

DELETE FROM weather WHERE city = 'Hayward';

所有属于Hayward的天气记录都将被删除.

SELECT * FROM weather;
     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      41 |      55 |    0 | 1994-11-29
(2 rows)

我们用下面形式的语句的时候一定要小心

DELETE FROM tablename;

如果没有条件,DELETE 将从指定 表中删除所有行,把它清空.做这些之前系统不会请求你确认!

北京网站建设公司

postgreSQL

postgreSQL-删除

Tags:

假设你对Hayward的天气不再感兴趣, 那么你可以用下面的方法把那些行从表中删除. 删除是用 DELETE 命令执行的∶

DELETE FROM weather WHERE city = 'Hayward';

所有属于Hayward的天气记录都将被删除.

SELECT * FROM weather;
     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      41 |      55 |    0 | 1994-11-29
(2 rows)

我们用下面形式的语句的时候一定要小心

DELETE FROM tablename;

如果没有条件,DELETE 将从指定 表中删除所有行,把它清空.做这些之前系统不会请求你确认!


北京网站建设公司

postgreSQL

postgreSQL-更新

Tags:

你可以用 UPDATE 命令更新现有的行. 假设你发现所有 11 月 28 日的温度计数都低了两度,那么 你就可以用下面的方式更新数据∶

UPDATE weather
    SET temp_hi = temp_hi - 2,  temp_lo = temp_lo - 2
    WHERE date > '1994-11-28';

看看数据的新状态∶

SELECT * FROM weather;

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      41 |      55 |    0 | 1994-11-29
 Hayward       |      35 |      52 |      | 1994-11-29
(3 rows)

北京网站建设公司

postgreSQL

SQL-查询一个表

Tags:

要从一个表中检索数据就是查询这个表. SQLSELECT 就是做这个用途的. 该语句分为选择列表(列出要返回的字段部分),表列表(列出从中检索数据 的表的部分),以及可选的条件(声明任意限制的部分).比如,要检索 表 weather 的所有行,键入∶

SELECT * FROM weather;

(这里 * 意思是“所有字段”) 而输出应该是∶

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      43 |      57 |    0 | 1994-11-29
 Hayward       |      37 |      54 |      | 1994-11-29
(3 rows)

你可以在目标列表中声明任意表达式,比如,你可以∶

SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

这样应该得出∶

     city      | temp_avg |    date
---------------+----------+------------
 San Francisco |       48 | 1994-11-27
 San Francisco |       50 | 1994-11-29
 Hayward       |       45 | 1994-11-29
(3 rows)

请注意这里的 AS 子句是如何给输出字段 重新命名的.(它是可选的.)

允许你使用任意布尔操作符(ANDOR, 和 NOT)给查询施加条件.比如,下面的查询检索 旧金山的下雨天的天气∶

SELECT * FROM weather
    WHERE city = 'San Francisco'
    AND prcp > 0.0;

Result:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)

最后再提醒一下,你可以要求选出来的结果按照某种顺序排序, 并且消除重复的行输出:

SELECT DISTINCT city
    FROM weather
    ORDER BY city;
     city
---------------
 Hayward
 San Francisco
(2 rows)

当然, DISTINCTORDER BY 可以独立使用.

北京网站建设公司


postgreSQL

SQL-向表中添加行

Tags:

INSERT 用于向表中添加行∶

INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');

请注意所有数据类型都使用了相当明了的输入格式. 那些不是简单数字值的常量必需用单引号(')包围, 就象在例子里一样. date 类型实际上对可接收的格式相当灵活, 不过在本教程里,我们应该坚持使用这里显示的格式.

point 类型要求一个座标对作为输入,如下∶

INSERT INTO cities  VALUES ('San Francisco', '(-194.0, 53.0)');

到目前为止使用的语法要求你记住字段的顺序.一个可选的 语法允许你明确地列出字段∶

INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)
    VALUES ('San Francisco', 43, 57, 0.0, '1994-11-29');

如果你需要,你可以用另外一个顺序列出字段或者是忽略某些字段, 也就是说,以未知的顺序∶

INSERT INTO weather (date, city, temp_hi, temp_lo)
    VALUES ('1994-11-29', 'Hayward', 54, 37);

许多开发人员认为明确列出字段要比依赖隐含的顺序是更好的风格.

请输入上面显示的所由命令,这样你在随后的各节中才有可用的数据.

你还可以使用 COPY 从文本文件中装载大量 数据.这么干通常更快,因为 COPY 命令就是为 这类应用优化的,同时还有比 INSERT 少一些的 灵活性.比如∶

COPY weather FROM '/home/user/weather.txt';

这里源文件的文件名必须是后端服务器可访问的, 而不是客户端可访问的,因为后端服务器直接读取文件.你可以在 PostgreSQL 7.3 参考手册 中读到更多有关 COPY 命令的信息.

北京网站建设公司