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) 表达式计算得出。
浙公网安备 33010602011771号