在本教程中,将学习如何使用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
语句向表中添加新行。