9.1第六章

From PostgreSQL wiki
Jump to navigationJump to search

数据处理(Data Manipulation)

插入数据(Inserting Data)

在创建完一个表的时候,它里面没有数据。在数据库使用前要做的第一件事就是向里面插入数据。数据在概念上是每次插入一行。当然可以每次插入多行,但是每次插入都不能小于一行的数据。即使你只知道几个字段的数值,数据库也将创建一个完整的新行。

使用 INSERT 命令创建一个新行。这条命令要求提供表名字以及表中每个字段的值。比如,假设来Chapter 5的产品表:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

下面例子是向一个表中插入一行:

INSERT INTO products VALUES (1, 'Cheese', 9.99);

数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常,数据值是文本(常量),但也允许使用标量表达式。

上述语法的缺点是你必须知道表中字段的顺序。你也可以明确地列出字段以避免这个问题。比如,下面的两条命令都和上面的那条命令效果相同:

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', 9.99);
INSERT INTO products (name, price, product_no) VALUES ('Cheese', 9.99, 1);

许多用户认为明确列出字段名是个好习惯。

如果你不知道所有字段的数值,那么可以省略其中的一些。这时候,这些未知字段将被填充为它们已经设置好的的缺省值。比如:

INSERT INTO products (product_no, name) VALUES (1, 'Cheese');
INSERT INTO products VALUES (1, 'Cheese');

第二种形式是 PostgreSQL 的一个扩展。它从左向右填充字段,先使用一些指定的值,而剩余的填充缺省值。

为了更为清晰,你也可以对独立的字段或者整个行明确使用缺省值:

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', DEFAULT);
INSERT INTO products DEFAULT VALUES;

你可以在一条命令中插入多行:

INSERT INTO products (product_no, name, price) VALUES
    (1, 'Cheese', 9.99),
    (2, 'Bread', 1.99),
    (3, 'Milk', 2.99);

【提示】要一次插入大量数据,可以看看 COPY 命令。它不像 INSERT 命令那么灵活,但是更高效。参考节14.4获取更多有关提高装载海量数据的性能。

更新数据(Updating Data)

修改已经存储在数据库中的数据的行为叫做更新。你可以更新单独的一行,也可以更新表中所有的行,还可以更新其中的一部分行。可以独立地更新每个字段,而其它的字段则不受影响。

要存在的行执行更新,你需要三种信息:

1 表的名字和表里要更新的字段名

2 字段的新值

3 要更新哪些行

我们在章5里说过,SQL 通常并不为数据行提供唯一标识。因此我们无法直接指定需要更新哪一行。但是,我们可以通过指定一个被更新的行需要满足的条件。只有在表里存在主键的时候 (不管你叫它什么),我们才能通过条件选取主键,有效的指定一个独立的行。图形化的数据库访问工具可以充许你更新独立行

比如,这条命令将所有产品价格为5的重新定价为10 :

UPDATE products SET price = 10 WHERE price = 5;

这样做可能导致零行、一行或多行数据被更新。如果我们试图执行一个不匹配任何行的更新,那也正确的。

让我们仔细看看这个命令。首先是关键字 UPDATE 跟着表名字。和平常一样,表名字也可以是用模式修饰的,否则就会从模式路径中把它找出来。然后是关键字 SET 跟着字段名与一个等号以及新的字段值。新的字段值可以是任意标量表达式,而不仅仅是常量。比如,如果你想把所有产品的价格提高 10% ,可以用:

UPDATE products SET price = price * 1.10;

如你所见,新值的表达式也可以引用行中现有的数值。我们还忽略了 WHERE 子句。如果我们忽略了这个子句,那么表中所有的行都要被更新。如果出现了 WHERE 子句,那么只有匹配其条件的行才会被更新。请注意在 SET 子句中的等号是一个赋值,而在 WHERE 子句中的等号是比较,不过这样并不会导致任何歧义。当然 WHERE 条件不一定非得是相等测试。许多其它操作符也都可以使用(参阅章9)。但是表达式必须得出一个布尔结果。

你还可以在一个 UPDATE 命令中更新更多的字段,方法是在 SET 子句中列出更多分配值。比如:

UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;

删除数据(Deleting Data)

到目前为止我们已经解释了如何向表中增加数据以及如何改变数据。剩下的是讨论如何删除不再需要的数据。和前面增加数据一样,删除数据也必须是从表中整行整行地删除。在上一节里我们提到了 SQL没有提供直接访问独立行的方法。因此,删除行只能是通过指定被删除行的匹配条件进行。如果你在表上有一个主键,那么你可以指定准确的行。当然,你也可以删除匹配条件的一组行,或者一次删除表中的所有行。

我们使用 DELETE 命令删除行。它的语法和 UPDATE 命令非常类似。比如,要从产品表中删除所有价格为 10 的产品的行,可以这样

DELETE FROM products WHERE price = 10;

如果你只是写

DELETE FROM products;

那么表中所有行都会被删除!程序员一定要注意。