PostgreSQL INSERT INTO 语句详解

在 PostgreSQL 中,INSERT INTO 语句用于向表中插入新的数据行。它有多种使用方式,下面将详细介绍其语法和常见用法。

基本语法

插入完整行

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
  • INSERT INTO:指定要插入数据的表名。
  • (column1, column2, column3, ...):可选参数,指定要插入数据的列名。如果省略该部分,则必须为表中的所有列提供值,且值的顺序要与表中列的顺序一致。
  • VALUES:指定要插入的数据值,值的数量和顺序必须与列名的数量和顺序一致。

示例:
假设我们有一个名为 employees 的表,包含 employee_idfirst_namelast_name 和 salary 列。
 
INSERT INTO employees (employee_id, first_name, last_name, salary)
VALUES (1, 'John', 'Doe', 5000);

插入部分行

如果只需要插入部分列的数据,可以只指定这些列的名称和对应的值。

INSERT INTO table_name (column1, column3)
VALUES (value1, value3);

示例:
 
INSERT INTO employees (first_name, salary)
VALUES ('Jane', 6000);

在这个例子中,employee_id 和 last_name 列将使用表定义中的默认值(如果有的话),或者如果没有默认值且列允许 NULL,则为 NULL

插入多行数据

可以在一个 INSERT INTO 语句中插入多行数据,只需在 VALUES 子句中提供多个值列表,用逗号分隔。
 
INSERT INTO table_name (column1, column2, column3, ...)
VALUES 
(value1_1, value1_2, value1_3, ...),
(value2_1, value2_2, value2_3, ...),
(value3_1, value3_2, value3_3, ...);

示例:
INSERT INTO employees (employee_id, first_name, last_name, salary)
VALUES 
(2, 'Alice', 'Smith', 5500),
(3, 'Bob', 'Johnson', 6500);

从其他表插入数据

可以使用 INSERT INTO ... SELECT 语句从一个表中选择数据并插入到另一个表中。

INSERT INTO table_name (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM another_table
WHERE condition;
  • SELECT 子句用于从 another_table 中选择要插入的数据。
  • WHERE 子句可选,用于过滤要插入的数据。

示例:
假设有一个名为 temp_employees 的临时表,其结构与 employees 表相同,我们可以将 temp_employees 表中的数据插入到 employees 表中。
 
INSERT INTO employees (employee_id, first_name, last_name, salary)
SELECT employee_id, first_name, last_name, salary
FROM temp_employees
WHERE salary > 5000;

插入默认值

如果要插入列的默认值,可以使用 DEFAULT 关键字。

INSERT INTO table_name (column1, column2)
VALUES (value1, DEFAULT);

示例:

INSERT INTO employees (employee_id, first_name, last_name)
VALUES (4, 'Eve', DEFAULT);

在这个例子中,salary 列将使用其默认值。

处理冲突

在插入数据时,如果违反了表的唯一约束或主键约束,可以使用 ON CONFLICT 子句来处理冲突。
 
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON CONFLICT (conflict_column)
DO NOTHING;
  • ON CONFLICT:指定冲突发生时的处理方式。
  • (conflict_column):指定发生冲突的列。
  • DO NOTHING:表示当发生冲突时,不做任何操作。也可以使用 DO UPDATE 来更新冲突的行。

示例:
INSERT INTO employees (employee_id, first_name, last_name, salary)
VALUES (1, 'John', 'Doe', 5000)
ON CONFLICT (employee_id)
DO NOTHING;

在这个例子中,如果 employee_id 为 1 的记录已经存在,则不会插入新记录。

以上就是 PostgreSQL 中 INSERT INTO 语句的详细语法和常见用法。

posted on 2025-03-17 09:52  数据与人文  阅读(1211)  评论(0)    收藏  举报