6.1. 插入数据

当一个表被创建后,它不包含数据。在数据库可以有点用之前要做的第一件事就是向里面插入数据。数据在概念上是以每次一行地方式被插入的。你当然可以每次插入多行,但是却没有办法一次插入少于一行的数据。即使你只知道几个列的值,那么你也必须创建一个完整的行。
  • 要创建一个新行,使用INSERT命令。这条命令要求提供表的名字和其中列的值。例如,考虑 第五章:数据定义 中的产品表:
    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 节获取更多有关批量装载性能的信息。

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