01/10/2018, 16:38

Bài 08: Câu lệnh Insert thêm dữ liệu trong MySQL

Trong bài viết này chúng ta sẽ học làm thế nào để sử dụng cầu lệnh MySQL INSERT để thêm dữ liệu vào trong bảng CSDL. Chúng ta cần thống nhất rằng bạn đã tạo một CSDL thành công. Nếu bạn chưa thực hiện được điều này thì hãy xem lại cách Lệnh tạo database. Nói chung về mặt cú pháp thì các ngôn ngữ ...

Trong bài viết này chúng ta sẽ học làm thế nào để sử dụng cầu lệnh MySQL INSERT để thêm dữ liệu vào trong bảng CSDL. Chúng ta cần thống nhất rằng bạn đã tạo một CSDL thành công. Nếu bạn chưa thực hiện được điều này thì hãy xem lại cách Lệnh tạo database.

Nói chung về mặt cú pháp thì các ngôn ngữ quản trị CSDL đều có mặt tương đồng và có điểm giống nhau. Ví dụ MySQL & MSSQL vì chúng đều là ngôn ngữ T-SQL. Chúng ta có 2 cú pháp sau:

1. Khai báo rõ ràng tên column

Câu lệnh MySQL INSERT cho phép bạn chèn một hoặc nhiều hàng vào một bảng. Sau đây minh họa cú pháp của câu lệnh INSERT:

NSERT INTO table_name(column1,column2,colum3,...)
VALUES (value1,value2,value3,...);

Trong đó:

  • table_name: Là tên bảng mà ta cần chèn thêm dữ liệu.
  • column1, column2... là danh sách các cột và phải cách nhau bằng dấu phảy.
  • value1, value2... là danh sách các giá trị phải cách nhau bằng dấu phảy.

Khi sử dụng cú pháp này thì các field ở vị trí nào sẽ tương ứng với vị trí của nó ở VALUES, và ở phần khai báo có bao nhiêu column thì ở phần value sẽ có bấy nhiêu value tương ứng.

Hãy tạo ra một bảng mới có tên nhiệm vụ để thực hành các câu lệnh INSERT.

CREATE TABLE IF NOT EXISTS tasks (
    task_id INT(11) AUTO_INCREMENT,
    subject VARCHAR(45) DEFAULT NULL,
    start_date DATE DEFAULT NULL,
    end_date DATE DEFAULT NULL,
    description VARCHAR(200) DEFAULT NULL,
    PRIMARY KEY (task_id)
);

Ví dụ, nếu bạn muốn chèn một nhiệm vụ mới vào bảng nhiệm vụ, bạn sử dụng câu lệnh INSERT như sau:

INSERT INTO tasks(subject,start_date,end_date,description)
VALUES('Learn MySQL INSERT','2010-01-01','2010-01-02','Start learning..');

Sau khi thực hiện , MySQL trả về một thông báo cho số hàng bị ảnh hưởng. Trong trường hợp này, một hàng bị ảnh hưởng bằng 1.

2. Không khai báo rõ tên column

INSERT INTO table_name
VALUES ('field_1', 'field_2', ..., 'field_n');

Trong trường hợp này thì bạn bắt buộc phải truyền cho tất cả các column, Nếu bạn có 10 column thì bạn phải truyền cho cả 10, nếu không sẽ báo lỗi ngay.

Mặc dù trường ID được thiết lập là AUTO_INCREMENT tự tăng nhưng vẫn phải truyền giá trị vào cho cho. Điều này khác hoàn toàn so với cách trên.

INSERT INTO tasks 
VALUES('2','Learn MySQL INSERT','2010-01-01','2010-01-02','Start learning..');

3. Insert nhiều dòng.

Để chèn nhiều hàng vào một bảng, bạn sử dụng câu lệnh INSERT với cú pháp sau đây:

INSERT INTO table_name(column1,column2...)
VALUES (value1,value2,...),
       (value1,value2,...),
...;

Với cách này bạn chỉ cần chú ý là danh sách các giá trị cần chèn vào phải cách nhau bằng dấu ','.

Ví dụ:

INSERT INTO tasks(subject,start_date,end_date,description)
VALUES ('Task 1','2010-01-01','2010-01-02','Description 1'),
       ('Task 2','2010-01-01','2010-01-02','Description 2'),
       ('Task 3','2010-01-01','2010-01-02','Description 3');

4. Insert với mệnh đề Select.

Trong MySQL, bạn có thể chỉ định các giá trị cho các câu lệnh INSERT từ một câu lệnh SELECT. Theo cá nhân mình đánh giá thì đây là phần khá hay của câu lệnh này mà đôi khi chúng ta vô tình bỏ quên nó. Tính năng này rất tiện dụng vì bạn có thể sao chép một bảng đầy đủ hoặc một phần bằng cách sử dụng INSERT và SELECT như sau:

INSERT INTO table_1
SELECT c1, c2, FROM table_2;

Ví dụ: Hãy copy bảng tasks tới bảng task_1.

Thì việc đầu tiên bạn cần là tạo bảng mới với tên task_1 bằng việc copy cấu chúc của bảng tasks như sau:

CREATE TABLE tasks_1 LIKE tasks;

Tiếp theo thêm dữ liệu từ các bảng tasks sang tasks_1 sử dụng câu lệnh INSERT sau đây:

INSERT INTO tasks_1
SELECT * FROM tasks;

Ok ! Bây giờ bạn hãy sử dụng câu lệnh SELECT để lấy toàn bộ dữ liệu từ bảng task_1.

SELECT 
    *
FROM
    tasks_1;

5. INSERT với ON DUPLICATE KEY UPDATE

Nếu bạn thêm một hàng mới trùng lặp/vi phạm về Primary KEY hoặc UNIQUE. Thì tất nhiên MySQL sẽ đưa ra cho bạn một thông báo lỗi và bạn không thể thực hiện tiếp dòng lệnh này.

INSERT INTO tasks(task_id,subject,start_date,end_date,description)
VALUES (4,'Test ON DUPLICATE KEY UPDATE','2010-01-01','2010-01-02','Next Priority');

Bạn sẽ nhận được một thông báo lỗi với nội dung là 'Error Code: 1062. Duplicate entry '4' for key 'PRIMARY' 0.016 sec'.

Tuy nhiên, nếu bạn chỉ định một số tùy chọn ON DUPLICATE KEY UPDATE  trong câu lệnh INSERT, MySQL sẽ chèn một hàng mới hoặc cập nhật hàng hiện có với các giá trị mới.

Ví dụ: 

INSERT INTO tasks(task_id,subject,start_date,end_date,description)
VALUES (4,'Test ON DUPLICATE KEY UPDATE','2010-01-01','2010-01-02','Next Priority')
ON DUPLICATE KEY UPDATE 
   task_id = task_id + 1, 
   subject = 'Test ON DUPLICATE KEY UPDATE';

Trong ví dụ này task_id=4 là đã tôn tại và nếu bạn chạy câu lệnh trên thì MySQL sẽ cập nhật hàng hiện có với các dữ liệu mới. Và nếu thành công bạn sẽ nhận được thông báo: '2 rows affected'

Chú ý: Dòng mới sẽ không được thêm vào nhưng dòng cũ với id=4 sẽ được cập nhật.

Lệnh INSERT ON DUPLICATE KEY UPDATE nó sẽ tương đương với câu lệnh sau đây.

UPDATE tasks 
SET 
    task_id = task_id + 1,
    subject = 'Test ON DUPLICATE KEY UPDATE'
WHERE
    task_id = 4;

( ~ : ~ )

Trần Trung Dũng

15 chủ đề

2610 bài viết

Cùng chủ đề
0