Skip to content

PostgreSQL数据操纵

Author:李东阳

1、插入数据(INSERT)

首先,我们先创建一张表(还是之前的那张产品表):

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

然后我们就可以往里面插入数据了:

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

当然你也可以显示的列出列,然后在插入数据:

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

推荐这么写!!!

如果你没有获得所有列的值,那么你可以省略其中的一些。在这种情况下,这些列将被填充为它们的缺省值。例如:

INSERT INTO products (name, price) VALUES ('Cheese',19.99);

你还可以同时插入多行数据:

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

而且你也可以插入查询出来的结果:

INSERT INTO products (product_no, name, price)
  SELECT product_no, name, price FROM new_products
    WHERE release_date = 'today';

2、更新数据(UPDATE)

你可以更新单个行,也可以更新表中所有的行,还可以更新其中的一部分行。 我们可以独立地更新每个列,而其他的列则不受影响。

要更新现有的行,使用UPDATE命令。这需要提供三部分信息:

  • 表的名字和要更新的列名

  • 列的新值

  • 要更新的是哪(些)行

所有价格为5的产品的价格更新为10:

UPDATE products SET price = 10 WHERE price = 5;

关键字SET, 后面跟着列名、一个等号以及新的列值。新的列值可以是任意标量表达式, 而不仅仅是常量。例如,如果你想把所有产品的价格提高 10%,你可以用:

UPDATE products SET price = price * 1.10;

3、删除数据(DELETE)

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

DELETE FROM products WHERE price = 10;

如果你只是写:

DELETE FROM products;

那么表中所有行都会被删除!你小子注意点。

4、从修改的行中返回数据

有时在修改行的操作过程中获取数据很有用。INSERTUPDATEDELETE命令都有一个支持这个的可选的 RETURNING子句。使用RETURNING 可以避免执行额外的数据库查询来收集数据,并且在否则难以可靠地识别修改的行时尤其有用。

INSERT中,可用于RETURNING的数据是插入的行。 这在琐碎的插入中并不是很有用,因为它只会重复客户端提供的数据。 但依赖于计算出的默认值时可以非常方便。例如,当使用 serial列来提供唯一标识符时, RETURNING可以返回分配给新行的ID:

CREATE TABLE users (firstname text, lastname text, id serial primary key);

INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING id;

RETURNING子句对于INSERT ... SELECT也非常有用。

UPDATE中,可用于RETURNING的数据是被修改行的新内容。 例如:

UPDATE products SET price = price * 1.10
  WHERE price <= 99.99
  RETURNING name, price AS new_price;

DELETE中,可用于RETURNING的数据是删除行的内容。例如:

DELETE FROM products
  WHERE obsoletion_date = 'today'
  RETURNING *;