Skip to content

SQL Insert Into

INSERT INTO 语句用于向表中添加新的行(记录)数据。这是您在使用 CREATE TABLE 定义表结构后,用来填充表的方式。

您可以使用 INSERT INTO 语句的几种方式,具体取决于您是为所有列提供值,还是仅为特定列提供值。

形式 1:插入所有列的值

如果您按照在 CREATE TABLE 中定义的顺序,为表中的所有列提供值,则无需指定列名。

INSERT INTO table_name VALUES (value1, value2, value3, …);

注意:这种形式不太健壮。如果表结构发生变化(例如,添加或重新排序了列),此语句可能会失败或错误地插入数据。通常建议使用形式 2。

形式 2:指定列名和值(推荐)

这种形式明确列出了您要插入数据的列,后跟对应的值。这更安全,可读性更高。

INSERT INTO table_name (column1, column2, column3, …) VALUES (value1, value2, value3, …);

value1, value2, ... 的顺序必须与 column1, column2, ... 的顺序匹配。

大多数现代 SQL 数据库允许在一个 INSERT INTO 语句中插入多行,这比多个单独的 INSERT 语句更高效:

INSERT INTO table_name (column1, column2, …) VALUES (value1a, value2a, …), (value1b, value2b, …), (value1c, value2c, …);

假设我们有一个 Customers 表,定义如下:

CREATE TABLE Customers ( CustomerID INT PRIMARY KEY AUTO_INCREMENT, — Or IDENTITY(1,1) for SQL Server, or SERIAL for PostgreSQL CustomerName VARCHAR(255) NOT NULL, ContactName VARCHAR(255), Address VARCHAR(255), City VARCHAR(100), PostalCode VARCHAR(20), Country VARCHAR(100) );

注意:AUTO_INCREMENT (MySQL)、IDENTITY (SQL Server) 或使用带 SERIAL 的 sequence (PostgreSQL) 意味着当插入新行时,CustomerID 将由数据库自动生成,以确保唯一性。

让我们向 Customers 表插入一个新客户,为除 CustomerID(它是自动生成的)之外的所有列提供值。

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('New Wave Imports', 'Helen Bennett', '200 Market St', 'San Francisco', '94107', 'USA');

执行此语句后,Customers 表将新增一行。此新客户的 CustomerID 将由数据库自动分配。

例如,如果这是第一条记录,它可能看起来像:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1New Wave ImportsHelen Bennett200 Market StSan Francisco94107USA

也可以只向指定列插入数据。任何未在 INSERT INTO 语句中列出的列将接收其 DEFAULT 值(如果已定义)或 NULL(如果该列可为空且没有默认值)。如果某列是 NOT NULL 且没有 DEFAULT 值,并且您省略了它,则 INSERT 将失败。

以下 SQL 语句将插入一个新行,但仅为 CustomerName、City 和 Country 提供数据。

INSERT INTO Customers (CustomerName, City, Country)
VALUES ('Urban Living', 'London', 'UK');

Customers 表随后可能包含(假设这是第二条记录):

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1New Wave ImportsHelen Bennett200 Market StSan Francisco94107USA
2Urban LivingNULLNULLLondonNULLUK

在此,对于 ‘Urban Living’ 客户,ContactName、Address 和 PostalCode 为 NULL,因为它们未被指定,且是可空列,没有默认值。

实际应用:向注册系统添加新用户,在电子商务平台中记录新销售,在应用程序日志中记录事件。

最佳实践:对于 INSERT 语句,始终使用显式的列列表(形式 2),以使您的 SQL 更易于维护,并在表 schema 发生变化时不易出错。

获取插入的 ID:许多应用程序需要知道新插入行的 ID(特别是对于自动生成的主键)。数据库系统提供了获取此 ID 的方法,例如 LAST_INSERT_ID() (MySQL)、SCOPE_IDENTITY() (SQL Server),或 RETURNING 子句 (PostgreSQL, SQLite)。