PostgreSQL INSERT INTO语句的常见用法

在 PostgreSQL 里,INSERT INTO 语句主要用于向表中添加新的数据行。以下是对其常见用法的详细介绍:

1. 插入单条完整记录

当你想插入一条完整的记录,也就是为表中的每一列都提供值时,可以使用这种方式。如果表定义中某列有默认值,也可以省略该列的值,让其使用默认值。
 
-- 假设存在一个名为 "students" 的表,包含 "id"、"name"、"age" 和 "gender" 列
INSERT INTO students (id, name, age, gender)
VALUES (1, 'Alice', 20, 'Female');

在这个例子中,我们明确指定了要插入数据的列名,然后在 VALUES 子句中按照列名的顺序依次给出对应的值。

2. 插入单条部分记录

若只需要为表中的部分列插入数据,可只指定这些列的名称,未指定的列如果有默认值则使用默认值,若允许为 NULL 则会被插入 NULL
 
INSERT INTO students (name, age)
VALUES ('Bob', 22);

这里只插入了 name 和 age 列的值,id 和 gender 列若有默认值就使用默认值,没有则为 NULL

3. 插入多条记录

可以在一个 INSERT INTO 语句中同时插入多条记录,只需在 VALUES 子句中提供多个值列表,各列表之间用逗号分隔。
INSERT INTO students (id, name, age, gender)
VALUES 
(2, 'Charlie', 21, 'Male'),
(3, 'David', 23, 'Male');

这种方式可以减少与数据库的交互次数,提高插入效率。

4. 从其他表插入数据

使用 INSERT INTO ... SELECT 语句可以从一个表中选择数据并插入到另一个表中。这在数据迁移、数据备份等场景中非常有用。

-- 假设有一个临时表 "temp_students",结构与 "students" 表相同
INSERT INTO students (id, name, age, gender)
SELECT id, name, age, gender
FROM temp_students
WHERE age > 20;

此例中,我们从 temp_students 表中选择 age 大于 20 的记录,并将这些记录插入到 students 表中。

5. 插入默认值

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

INSERT INTO students (id, name, age)
VALUES (4, 'Eve', DEFAULT);

这里 age 列将使用其在表定义中设置的默认值。

6. 处理插入冲突

当插入的数据违反了表的唯一约束或主键约束时,可以使用 ON CONFLICT 子句来处理冲突。有两种常见的处理方式:

6.1 冲突时不做任何操作

INSERT INTO students (id, name, age, gender)
VALUES (1, 'Alice', 20, 'Female')
ON CONFLICT (id)
DO NOTHING;

在这个例子中,id 是主键或具有唯一约束。如果要插入的 id 已经存在于表中,ON CONFLICT (id) DO NOTHING 会让数据库不执行插入操作,直接忽略此次插入请求。

6.2 冲突时更新记录

INSERT INTO students (id, name, age, gender)
VALUES (1, 'Alice', 20, 'Female')
ON CONFLICT (id)
DO UPDATE 
SET name = EXCLUDED.name,
    age = EXCLUDED.age,
    gender = EXCLUDED.gender;

这里,EXCLUDED 是一个特殊的表,它包含了由于冲突而未能插入的数据。当发生冲突时,会将 EXCLUDED 表中的数据更新到原表中对应的记录上。

7. 插入表达式结果

可以插入通过表达式计算得到的值。
 
INSERT INTO students (id, name, age, enrollment_year)
VALUES (5, 'Frank', 24, EXTRACT(YEAR FROM CURRENT_DATE));
在这个例子中,enrollment_year 列插入的是当前日期的年份,通过 EXTRACT(YEAR FROM CURRENT_DATE) 表达式计算得出。

posted on 2025-03-17 10:03  数据派  阅读(732)  评论(0)    收藏  举报