使用 INSERT INTO 语句将一行或多行插入到 PostgreSQL 的表中。
INSERT INTO <table-name> (<column1>, <column2>,...)
VALUES (<value1>, <value2>,...)
RETURNING * or <column_name>;
- 将
INSERT INTO
子句与要插入数据的table-name
结合使用。 如果要将数据插入表的所有列,则指定列列表是可选的。 - 如果要将数据插入某些列,请在
VALUES
子句后提供逗号分隔值的列表。 - RETURNING 子句是可选的,它将返回所有插入值或指定列的值的列表。
让我们创建以下 employee
表,我们将在其中插入数据。
CREATE TABLE employee (
emp_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
gender CHAR(1),
birthdate DATE,
email VARCHAR(100) UNIQUE,
salary INT
);
现在,以下 INSERT 语句将在employee表中插入数据。
INSERT INTO employee
VALUES(1,'Annie','Smith','F', DATE '1988-01-09', '[email protected]',5000);
上面的INSERT语句将数据插入到employee表的所有列中。列值在 VALUES 子句中指定。
如果您没有在 INSERT 语句中指定所需的列(NOT NULL 列),Postgres 将引发错误。如果没有指定可选列(NULL 列),则 INSERT 语句将在表中添加 NULL 或 DEFAULT 值(如果指定)。
要插入字符或字符串数据,需要用单引号 'value'
括起来。要将日期值插入到 DATE 数据类型的列中,需要以"YYYY-MM-DD"格式指定日期。
如果表有一个 SERIAL 列,Postgres 会自动为该序列列生成一个序列号。无需在 INSERT 语句中指定该列的值。
在 pgAdmin 中执行上述查询将显示以下结果:
执行 INSERT INTO
语句将返回 INSERT oid count
结果以及查询执行状态,例如在 pgAdmin 中,"查询在 52 毫秒内成功返回"。
在 INSERT oid count
中,oid
是一个对象标识符,对于 INSERT 语句始终为 0。 count
是插入到表中的行数。上面的语句插入了一行,因此它将返回INSERT 0 1
。
必须按照表中定义的列的顺序指定列的值,否则会导致数据插入错误或出错。例如,以下尝试在性别列中插入日期值,因此它将返回错误。
INSERT INTO employee
VALUES(1,'Annie','Smith',DATE '1988-01-09','F');
最好的做法是使用 INSERT 语句指定列名称,以将数据插入到正确的列中并使其更易于维护。因此,如果您将来在表中添加列,就不会引发错误。
INSERT INTO employee(emp_id, first_name, last_name, gender, birthdate, email, salary)
VALUES(1,'Annie','Smith','F', DATE '1988-01-09', '[email protected]',5000);
您可以根据需要更改列的顺序或从 INSERT 语句中删除列。
INSERT INTO employee(emp_id, first_name, last_name, birthdate, gender)
VALUES(1,'Annie','Smith', DATE '1988-01-09', 'F');
RETURNING 子句
RETURNING
子句返回插入的列值。 RETURNING *
返回所有插入的值,或者 RETURNING column-name
返回指定的列值。
当您有自动生成的 SERIAL 列作为主键时,这非常有用。您可以使用 RETURNING
子句获取生成的值。
INSERT INTO employee (emp_id, first_name, last_name, gender, birthdate)
VALUES (2, 'Susan', 'Klassen', 'F', DATE '2002-03-26')
RETURNING *;
上述查询将在 pgAdmin 中显示以下结果。
要在插入后返回特定的插入列,请在 RETURNING
子句后指定列名称。 Bellow将向employee表插入数据并返回新插入的emp_id。
INSERT INTO employee (emp_id, first_name, last_name, gender, birthdate, email)
VALUES (3, 'May', 'Kaasman', 'M', '1994-07-09', '[email protected]')
RETURNING emp_id;
返回值可以使用 AS 子句重命名。以下使用 AS 子句将 emp_id
列重命名为 EmployeeId
。
INSERT INTO employee (emp_id, first_name, last_name, gender, birthdate)
VALUES (4, 'Charlton', 'Duran', 'M', DATE '2010-10-02')
RETURNING emp_id AS EmployeeID;
插入多行
INSERT 语句还可以通过指定多个 VALUES 子句在单个查询中向表中添加多行。
以下代码将向 employee
表插入两行:
INSERT INTO employee(emp_id, first_name, last_name, gender, birthdate)
VALUES
(5,'Sachin','Tendulkar','M', DATE '1978-01-09'),
(6,'Kapil', 'Dev', 'M', DATE '1959-03-26'),
(7,'Joe','Root','M', DATE '1988-11-29'),
(8,'Moeen', 'Ali', 'M', DATE '1999-04-16');
上面的查询将向employee表中插入四行,并在 pgAdmin 中显示以下结果。
您还可以在插入多行时使用 RETURNING
子句,如下所示。
INSERT INTO employee(emp_id, first_name, last_name, gender, birthdate)
VALUES
(5,'Sachin','Tendulkar','M', DATE '1978-01-09'),
(6,'Kapil', 'Dev', 'M', DATE '1959-03-26'),
(7,'Joe','Root','M', DATE '1988-11-29'),
(8,'Moeen', 'Ali', 'M', DATE '1999-04-16')
RETURNING *;
以上将在 pgAdmin 中显示以下结果:
将多个记录从一个表插入到另一表时,PostgreSQL 可能会引发某些行错误。 使用UPSERT操作来处理批量插入操作中的错误。接下来就来了解一下吧。