Skip to content

数据填充

在这一章节中,我们将学习如何使用 PostgreSQL 的 INSERT 语句和 COPY 命令向数据库表中添加数据。作为初学者,理解这些基本操作对于有效管理和使用数据库至关重要。

INSERT 语句基础

INSERT 语句是 PostgreSQL 中用于向表中添加新行数据的基本命令。让我们通过实际业务场景来理解它的用法。

基本语法

最基本的 INSERT 语法如下:

sql
INSERT INTO 表名 VALUES (值1, 值2, ...);

TIP

实际场景假设我们正在开发一个天气预报应用,需要记录各个城市的天气数据。

例如,要向前面创建的 weather 表中添加一条旧金山的天气记录:

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

注意数据类型的输入格式:

  • 文本和日期类型需要用单引号(')括起来
  • 数值类型直接输入数字即可
  • 日期类型在本教程中使用 'YYYY-MM-DD' 格式

特殊数据类型的输入

对于一些特殊的数据类型,PostgreSQL 提供了专门的输入格式。例如,point 类型(用于存储坐标点)需要一个坐标对作为输入:

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

明确指定列名的 INSERT 语句

上面的基本语法要求您记住表的列顺序,这在复杂表中容易出错。PostgreSQL 提供了一种更灵活的语法,允许您显式列出要插入的列名:

sql
INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);

优势

这种方式有几个明显的优势:

  1. 不需要记住列的顺序
  2. 可以按照任意顺序列出列
  3. 可以省略某些列(它们将使用默认值或为 NULL)

实例演示

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

甚至可以改变列的顺序,或者省略不需要的列:

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

在这个例子中,我们省略了 prcp(降水量)列,因为这个数据暂时未知。

大多数数据库专家建议始终显式列出列名,这样可以使代码更加清晰,减少因表结构变化带来的风险。

批量数据导入:COPY 命令

当需要导入大量数据时,逐条使用 INSERT 语句效率较低。PostgreSQL 提供了专门用于批量导入数据的 COPY 命令:

sql
COPY 表名 FROM '文件路径';
实际应用场景

假设您的气象站每天自动生成一个包含天气数据的文本文件,需要将其导入数据库:

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

文件格式通常是制表符分隔的文本,每行对应表中的一行数据。

> `COPY` 命令中指定的文件路径必须在**数据库服务器**上可访问,而非客户端电脑上,因为是 PostgreSQL 后端进程直接读取该文件。

INSERT 与 COPY 的对比

sql
-- 适合插入少量记录
INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)
    VALUES ('San Francisco', 43, 57, 0.0, '1994-11-29');
sql
-- 适合插入大量记录
COPY weather FROM '/home/user/weather.txt';
命令优点缺点适用场景
INSERT灵活性高,可精确控制每一列大量数据时效率低单条或少量数据插入
COPY高效,针对批量导入优化灵活性较低,要求格式严格大量数据的批量导入

如果您需要频繁地导入大量数据,使用`COPY`命令可以显著提高数据库操作效率。

小结

  • 使用 INSERT INTO 表名 VALUES (...) 可以插入完整行数据
  • 使用 INSERT INTO 表名 (列1, 列2, ...) VALUES (...) 可以指定特定列插入数据
  • 对于大量数据导入,COPY 命令效率更高