使用 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 中执行上述查询将显示以下结果:

    PostgreSQL 插入数据INSERT INTO 语句

    执行 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'); 

    PostgreSQL 插入数据INSERT INTO 语句

    最好的做法是使用 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 中显示以下结果。

    PostgreSQL 插入数据INSERT INTO 语句

    要在插入后返回特定的插入列,请在 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; 

    PostgreSQL 插入数据INSERT INTO 语句

    插入多行

    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 中显示以下结果。

    PostgreSQL 插入数据INSERT INTO 语句

    您还可以在插入多行时使用 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 插入数据INSERT INTO 语句

    将多个记录从一个表插入到另一表时,PostgreSQL 可能会引发某些行错误。 使用UPSERT操作来处理批量插入操作中的错误。接下来就来了解一下吧。