Insert (SQL)

Câu lệnh SQL **INSERT** (có nghĩa là **thêm**) dùng để thêm dữ liệu vào một bảng trong cơ sở dữ liệu quan hệ.

## Cấu trúc cơ bản
Câu lệnh insert có cấu trúc như sau:
 
* INSERT INTO *table* (*column1*, [*column2,... *]) VALUES (*value1*, [*value2,...*])

Số lượng cột và số lượng giá trị trong câu lệnh phải bằng nhau. Nếu tên cột không được chỉ ra trong câu truy vấn, thì giá trị mặc định cho cột được sử dụng. Các giá trị (được xác định cụ thể hay ngầm định) trong câu lệnh `INSERT` phải thỏa các ràng buộc của bảng dữ liệu (như giá trị từ khóa chính, ràng buộc `[[CHECK (SQL)|CHECK]]`, và ràng buộc không rỗng (`[[NOT NULL]]`). Nếu có lỗi xuất hiện do xung đột với hằng số thì sẽ không có hàng nào được thêm vào

Ví dụ:
 
 INSERT INTO phone_book (name, number) VALUES ('John Doe', '555-1212');

Khi tất cả giá trị của các cột được chỉ ra thì ta có thể dùng cách viết thu gọn. Chú ý: các dữ liệu nằm trong ngoặc đơn sau `VALUES` phải theo đúng trình tự các cột được định nghĩa hay thiết kế trong bảng dữ liệu.

* INSERT INTO *table* VALUES (*value1*, [*value2,...*])

Ví dụ: (giả định trong bảng dữ liệu 'phone_book' chỉ có 2 cột 'name' và 'number'):
 
 INSERT INTO phone_book VALUES ('John Doe', '555-1212');

Giả sử chúng ta muốn insert từ textbox xuống database 
* Insert into nametable(ma,hovaten) values('"+Txtma.text+","+txthovaten.text+"');

## Tùy chọn
Một đặc điểm tùy chọn của SQL (bắt đầu từ phiên bản SQL-92) là sử dụng các *cấu trúc xây dựng giá trị hàng* (*row value constructors*) để thêm nhiều hàng vào bảng dữ liệu cùng lúc:
* INSERT INTO *table* (*column1*, [*column2,... *]) VALUES (*value1a*, [*value1b,...*]), (*value2a*, [*value2b,...*]),...

Cả hai hệ dữ liệu DB2 và MySQL đều hỗ trợ đặc điểm tùy chọn này.

Ví dụ: (giả định trong bảng dữ liệu 'phone_book' chỉ có 2 cột 'name' và 'number'):

 INSERT INTO phone_book VALUES ('John Doe', '555-1212'), ('Peter Doe', '555-2323');

- nếu sử dụng cách thêm dữ liệu thông thường sẽ phải dùng 2 câu lệnh như sau:

 INSERT INTO phone_book VALUES ('John Doe', '555-1212');
 INSERT INTO phone_book VALUES ('Peter Doe', '555-2323');

Ví dụ (tạo dữ liệu cho 1 bảng dữ liệu từ dữ liệu của 1 bảng khác / sao chép dữ liệu bằng câu lệnh `INSERT`):

 INSERT INTO phone_book2 SELECT * FROM phone_book
 WHERE NAME IN ('John Doe', 'Peter Doe')

## Truy vấn Từ khóa
*Từ khóa thay thế* (*surrogate key*) thường được sử dụng để thay thế từ khóa chính (*primary key*) khi xảy ra trường hợp cần truy vấn (sử dụng hay lưu) tự động các từ khóa chính trong 1 câu lệnh thêm `INSERT` để dùng lại trong 1 câu lệnh thêm `INSERT` khác. Vì câu lệnh thêm `INSERT` không trả về dữ liệu theo dạng hàng, nên cần sử dụng một số cách thay thế để truy vấn từ khóa trong những trường hợp như trên. Một số cách thay thế thông thường:

* Sử dụng thủ tục truy vấn (*stored procedure*).
* Sử dụng câu lệnh truy vấn `[[Select (SQL)|SELECT]]` trên 1 bảng dữ liệu tạm chứa thông tin về (các) hàng vừa mới được thêm.
* Sử dụng câu lệnh thêm `INSERT` kết hợp trong 1 câu lệnh truy vấn `[[Select (SQL)|SELECT]]`.
* Sử dụng từ khóa duy nhất GUID (*Globally Unique Identifier*) trong cả hai câu lệnh thêm `INSERT` và câu lệnh truy vấn `[[Select (SQL)|SELECT]]`.

## Tham khảo

* Peter Rob & Carlos Coronel. *Database System: Design, Implementation, & Management*, 2004, *THOMSON Course Technology*.

## Xem thêm
* SQL
* Select (SQL)
* Delete (SQL)
* Update (SQL)
* Join (SQL)