📅  最后修改于: 2023-12-03 15:06:55.356000             🧑  作者: Mango
在 PostgreSQL 中,我们可以使用带有匹配列的 INSERT INTO
语句来将一个表的数据复制到另一个表,同时还可以根据需要更新或修改列。
在开始本教程之前,我们需要完整的表结构,并填充一些数据以作为演示。
CREATE TABLE source_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
age INTEGER,
email VARCHAR(100)
);
CREATE TABLE dest_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
age INTEGER,
email VARCHAR(100),
status VARCHAR(20) DEFAULT 'new'
);
INSERT INTO source_table (name, age, email)
VALUES
('Alice', 23, 'alice@example.com'),
('Bob', 35, 'bob@example.com'),
('Charlie', 42, 'charlie@example.com');
接下来,我们将使用以下语句从 source_table
复制数据到 dest_table
中:
INSERT INTO dest_table (name, age, email)
SELECT name, age, email FROM source_table
ON CONFLICT (email) DO UPDATE SET
name = EXCLUDED.name,
age = EXCLUDED.age;
上述语句使用 INSERT INTO
和 SELECT
两个基本操作,我们选择了需要复制的列,并使用 ON CONFLICT
子句来指示 PostgreSQL 如果有相同的 email,则执行更新操作。
在这里,EXCLUDED
值表示匹配列已经存在的行,ON CONFLICT
子句所跟随的 DO UPDATE SET
部分包含带有要更新的列的 SET
子句。
这样,就可以将源表中的数据复制到目标表中,同时已匹配的记录将被更新,未匹配的记录将被插入,并为新记录设置默认的 status
值。
在本教程中,我们向你展示了如何使用带有匹配列的 INSERT INTO
语句来将一个 PostgreSQL 表的数据复制到另一个表中。通过指定一组匹配规则,并使用 ON CONFLICT
子句选择操作,可以轻松完成这个过程。