SQL Server Insert语句

在本教程中,将学习如何使用INSERT语句向表中添加新行。

SQL Server INSERT语句简介

要在表中添加一行或多行,请使用INSERT语句。 以下是INSERT语句的最基本形式:

INSERT INTO table_name (column_list)
VALUES (value_list);

下面更详细地解释这种语法。

首先,table_name指定要插入的表的名称。 通常,通过模式名称引用表名称,例如production.products,其中production是模式名称,products是表名称。

其次,column_list指定要在其中插入数据的一个或多个列的列表。必须将列列表括在括号中并用逗号分隔列。

如果列在列列表中没有出现,则SQL Server必须能够提供插入值,否则无法插入行。

SQL Server自动对表中可用的列使用以下值,但不会出现在INSERT语句的列列表中:

  • 如果列具有IDENTITY属性,则为下一个增量值。
  • 如果列具有指定的默认值,则为默认值。
  • 如果列的数据类型是时间戳数据类型,则为当前时间戳值。
  • 如果列可以为NULL值,则使用NULL
  • 如果列是计算列,则使用计算的值。

第三,要在VALUES子句中提供插入的值列表。 列列表中的每列必须在值列表中具有相应的值。 此外,必须将值列表括在括号中。

SQL Server INSERT语句示例

为了方便演示,创建一个名为promotions的新表:

CREATE TABLE sales.promotions (
    promotion_id INT PRIMARY KEY IDENTITY (1, 1),
    promotion_name VARCHAR (255) NOT NULL,
    discount NUMERIC (3, 2) DEFAULT 0,
    start_date DATE NOT NULL,
    expired_date DATE NOT NULL
);

在本声明中,在sales模式中创建了一个名为promotions的新表。 promotions表有五列,包括:促销标识号(promotion_id),名称(name),折扣(discount),开始日期(start_date)和过期日期(expired_date)。

promotion_id是标识列,因此当向表中添加新行时,SQL Server会自动填充其值。

1. 基本INSERT示例

以下语句将新行插入promotions表:

INSERT INTO sales.promotions (
    promotion_name,
    discount,
    start_date,
    expired_date
)
VALUES
    (
        '2020夏季促销',
        0.25,
        '20200601',
        '20200901'
    );

在此示例中,为promotions表中的四列指定了值。但没有为promotion_id列指定值,因为SQL Server会自动为此列提供值。

如果INSERT语句成功执行,将返回插入的行数。 在这种情况下,SQL Server发出以下消息:

(1 row affected)

要验证插入操作结果,请使用以下查询表中的数据:

SELECT
    *
FROM
    sales.promotions;

执行上面查询语句,得到以下结果:

2. 插入并返回插入的值

要捕获插入的值,请使用OUTPUT子句。 例如,以下语句将新行插入promotions表并返回promote_id列的插入值:

INSERT INTO sales.promotions (
    promotion_name,
    discount,
    start_date,
    expired_date
) OUTPUT inserted.promotion_id
VALUES
    (
        '2020秋季促销',
        0.15,
        '20201001',
        '20201101'
    );

要从多个列中捕获插入的值,请在输出中指定列,如以下语句所示:

INSERT INTO sales.promotions (
    promotion_name,
    discount,
    start_date,
    expired_date
) OUTPUT inserted.promotion_id,
 inserted.promotion_name,
 inserted.discount,
 inserted.start_date,
 inserted.expired_date
VALUES
    (
        '2020冬季促销',
        0.2,
        '20201201',
        '20200101'
    );

执行上面查询语句,得到以下输出结果:

3. 将显式值插入标识列

通常,不为标识列指定值,因为SQL Server将自动提供值。但是,在某些情况下,可能希望在标识列中插入值,例如数据迁移。

请参阅以下INSERT语句:

INSERT INTO sales.promotions (
    promotion_id,
    promotion_name,
    discount,
    start_date,
    expired_date
) OUTPUT inserted.promotion_id
VALUES
    (
        2,
        '2020春季促销',
        0.25,
        '20200201',
        '20200301'
    );

SQL Server发出以下错误:

要为标识列插入显式值,必须首先执行以下语句:

SET IDENTITY_INSERT table_name ON;

要关闭标识插入,请使用类似的语句:

SET IDENTITY_INSERT table_name OFF;

执行以下语句,在promotion表中插入标识列的值:

SET IDENTITY_INSERT sales.promotions ON;

INSERT INTO sales.promotions (
    promotion_id,
    promotion_name,
    discount,
    start_date,
    expired_date
) OUTPUT inserted.promotion_id
VALUES
    (
        2,
        '2020春季促销',
        0.25,
        '20200201',
        '20200301'
    );

SET IDENTITY_INSERT sales.promotions OFF;

在此示例中,首先,打开标识插入,然后插入一个具有标识列的显式值的行,最后关闭标识插入。

以下查询显示插入后promotions表中的数据:

SELECT
    *
FROM
    sales.promotions;

在本教程中,学习了如何使用SQL Server INSERT语句向表中添加新行。


上一篇: SQL Server修改数据 下一篇: SQL Server数据查询