06/04/2021, 14:50

lệnh INSERT trong SQL Server - SQL Server căn bản

Ở bài trước bạn đã biết cách sử dụng lệnh SELECT rồi, vậy trong trong bài này mình sẽ nói đến lệnh INSERT, đây là lệnh dùng để thêm một dòng dữ liệu vào bảng. 1. INSERT trong SQL Server Trước tiên bạn hãy xem cú pháp của lệnh này như sau: INSERT INTO ...

Ở bài trước bạn đã biết cách sử dụng lệnh SELECT rồi, vậy trong trong bài này mình sẽ nói đến lệnh INSERT, đây là lệnh dùng để thêm một dòng dữ liệu vào bảng.

1. INSERT trong SQL Server

Trước tiên bạn hãy xem cú pháp của lệnh này như sau:

INSERT INTO table_name (column_list)
VALUES (value_list);

Trong đó:

  • table_name là tên của table muốn thêm dữ liệu
  • column_list là danh sách các column
  • value_list là danh sách các giá trị tương ứng với column

Các cặp giá trị của column và value tương ứng với nhau. Ví dụ value đứng thứ 3 sẽ thuộc về column đứng thứ 3.

Ví dụ: Thêm một sinh viên mới.

INSERT INTO SINHVIEN (ID, NAME, AGE)
VALUES (1, "Nguyen Van Cuong", 29);

Giá trị của các column tương ứng như sau:

  • ID => 1
  • NAME  => Nguyen Van Cuong
  • AGE => 29

2. Các ví dụ với lệnh INSERT

Sau đây là các ví dụ minh họa cho các trường hợp thường gặp khi thêm dữ liệu vào table với lệnh INSERT.

Trước tiên bạn hãy tạo một bảng như sau:

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
); 

Hãy để ý đến các ràng buộc nhé, nó rất quan trọng trong việc xử lý dữ liệu trước khi chạy lệnh SQL.

INSERT không trả về giá trị

Trường hợp này thì chạy bình thường.

INSERT INTO sales.promotions (
    promotion_name,
    discount,
    start_date,
    expired_date
)
VALUES
    (
        '2018 Summer Promotion',
        0.15,
        '20180601',
        '20180901'
    );

Các bạn thấy mình không truyền dữ liệu cho khóa chính promotion_id, lý do là cột này được thiết lập tăng tự động nên giá trị sẽ tự tăng lên 1 cho mỗi record.

Chạy câu SQL này bạn sẽ nhận được kết thành công quả như sau:

(1 row affected)

Để xem dữ liệu đã được thêm chưa thì ta chạy lệnh.

SELECT
    *
FROM
    sales.promotions;

Kết quả:

SQL Server INSERT example png

INSERT lấy thông tin trả về

Tất cả dữ liệu vừa được insert sẽ được lưu trong biến inserted, và để lấy dữ liệu của inserted thì ta dùng lệnh OUTPUT.

Ví dụ dưới đây lấy ID vừa insert.

INSERT INTO sales.promotions (
    promotion_name,
    discount,
    start_date,
    expired_date
) OUTPUT inserted.promotion_id
VALUES
    (
        '2018 Fall Promotion',
        0.15,
        '20181001',
        '20181101'
    );

Nếu muốn lấy nhiều column hơn thì hãy tách chúng bởi dấy phẩy.

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
    (
        '2018 Winter Promotion',
        0.2,
        '20181201',
        '20190101'
    );

Gán dữ liệu cho khóa chính tăng tự động

Khác với MySQL, SQL Server không cho phép bạn gán dữ liệu cho khóa chính tăng tự động (identity), vì vậy khi bạn cố tình gán thì sẽ bị và không thêm được.

Hãy xem câu truy vấn dưới đây:

INSERT INTO sales.promotions (
    promotion_id,
    promotion_name,
    discount,
    start_date,
    expired_date
) OUTPUT inserted.promotion_id
VALUES
    (
        4,
        '2019 Spring Promotion',
        0.25,
        '20190201',
        '20190301'
    );

Mình đã cố gắng gán giá trị cho ID là 4 nên khi chạy câu SQL này sẽ bị lỗi như sau:

Cannot insert explicit value for identity column in 
table 'promotions' when IDENTITY_INSERT is set to OFF.

Ý nó muốn bạn hãy tắt Identity trước rồi mới gán được data cho ID.

Để tắt / mở Identity cho thao tác Insert thì bạn chạy câu SQL sau:

ON
SET IDENTITY_INSERT table_name ON;

OFF
SET IDENTITY_INSERT table_name OFF;

Như vậy tổng câu lệnh SQL cho phần này như sau:

SET IDENTITY_INSERT sales.promotions ON;
 
INSERT INTO sales.promotions (
    promotion_id,
    promotion_name,
    discount,
    start_date,
    expired_date
)
VALUES
    (
        4,
        '2019 Spring Promotion',
        0.25,
        '20190201',
        '20190301'
    );
 
 
SET IDENTITY_INSERT sales.promotions OFF;

Trong bài học này bạn đã được học cách sử dụng lệnh INSERT trong SQL Server để thêm mới một dòng dữ liệu vào table.

Hoàng Hải Đăng

24 chủ đề

7226 bài viết

Cùng chủ đề
0