18/08/2018, 11:05

(PRIMARY KEY) Tạo khóa chính trong MySQL

PRIMARY KEY (Khóa chính) là gì? PRIMARY KEY được dùng để xác định mỗi mẫu tin (record) trong bảng là duy nhất . Từ đó nó giúp chúng ta phân biệt được các mẫu tin. Mỗi bảng chỉ có thể tồn tại một PRIMARY KEY. Giá trị PRIMARY KEY của từng mẫu tin phải là duy nhất (không được ...

PRIMARY KEY (Khóa chính) là gì?

PRIMARY KEY được dùng để xác định mỗi mẫu tin (record) trong bảng là duy nhất. Từ đó nó giúp chúng ta phân biệt được các mẫu tin.

Mỗi bảng chỉ có thể tồn tại một PRIMARY KEY.

Giá trị PRIMARY KEY của từng mẫu tin phải là duy nhất (không được trùng nhau).

Ví dụ, có bảng sinh viên như sau:

Full_name
Nguyễn Thành Nhân
Tần Thúc Bảo 
Trình Giảo Kim
Nguyễn Thành Nhân
La Thành
Nguyễn Thành Nhân

Nhận thấy: Ở bảng trên có đến 3 người Nguyễn Thành Nhân, không thể xác định được ai là ai. 

Do đó: Để phân biệt, ta thêm vào bảng một khóa chính có tên là MSSV (mã số sinh viên) như sau:

Mssv Full_name
101 Nguyễn Thành Nhân
102 Tần Thúc Bảo
103 Trình Giảo Kim
104 Nguyễn Thành Nhân
105 La Thành
106 Nguyễn Thành Nhân

Từ đây việc phân biệt các sinh viên đã quá rõ ràng (Ví dụ: nói đến sinh viên Nguyễn Thành Nhân thứ 2 là ta biết người đó có mssv 104).

Ví dụ tạo một bảng sinh viên dùng cột Mssv làm khóa chính

Sử dụng câu lệnh dưới đây để tạo một bảng sinh viên

CREATE TABLE sinh_vien(
    Mssv INT PRIMARY KEY,
    Full_name VARCHAR(150),
    Phone INT,
    Address VARCHAR(255)
);
INSERT INTO sinh_vien (Mssv, Full_name, Phone, Address) VALUES
(101, 'Nguyen Thanh Nhan', 111111111, '111 đường ABC, Cần Thơ'),
(102, 'Pham Thu Huong', 222222222, '222 đường DEF, Cần Thơ'),
(103, 'Nguyen Nhu Ngoc', 333333333, '333 đường GHI, Cần Thơ'),
(104, 'Bui Thanh Bao', 444444444, '444 đường JKL, Cần Thơ'),
(105, 'Le My Nhan', 555555555, '555 đường MNO, Cần Thơ');

Bạn thử thêm vào một sinh viên với các thông tin bất kỳ, nhưng Mssv là một trong 5 Mssv trên, bạn sẽ thấy điều kì diệu

INSERT INTO sinh_vien VALUES (103, 'Tan Thuc Bao', 777777777, '777 đường XYZ, Cần Thơ');

Sau khi chạy câu lệnh, nhận thấy câu lệnh bị lỗi, do Mssv 103 đã tồn tại trong bảng sinh_vien

Ví dụ tạo một bảng sinh viên dùng cột họ tên và địa chỉ nhà làm khóa chính

Ở ví dụ này, chúng ta không dùng mã số sinh viên để làm khóa chính nữa, ta sẽ dùng họ tên và địa chỉ nhà.

Về mặt lý thuyết, hai sinh viên khác nhau không thể có chung một địa chỉ nhà (nếu có cùng địa chỉ nhà thì tức họ là anh em, mà anh em thì tên sẽ khác nhau). Do đó, ta có thể ghép họ tên và địa chỉ nhà lại thành một khóa chính để xác định một sinh viên.

Sử dụng câu lệnh dưới đây để tạo bảng sinh viên

CREATE TABLE sinh_vien(
    Full_name VARCHAR(150),
    Phone INT,
    Address VARCHAR(255),
    CONSTRAINT Name_Address PRIMARY KEY (Full_name, Address)
);
INSERT INTO sinh_vien (Full_name, Phone, Address) VALUES
('Nguyen Thanh Nhan', 111111111, '111 đường ABC, Cần Thơ'),
('Pham Thu Huong', 222222222, '222 đường DEF, Cần Thơ'),
('Nguyen Nhu Ngoc', 333333333, '333 đường GHI, Cần Thơ'),
('Bui Thanh Bao', 444444444, '444 đường JKL, Cần Thơ'),
('Le My Nhan', 555555555, '555 đường MNO, Cần Thơ');

Giải thích câu lệnh trên: Chúng ta ghép Full_name và Address thành một khóa chính có tên là Name_Address. Name_Address không phải là một cột, những nó giúp xác định các mẫu tin bởi cột Full_name và cột Address.

Nếu thêm một mẫu tin có Full_name và Address trùng với một mẫu tin đã tồn tại thì sẽ bị lỗi.

Tạo khóa chính trong trường hợp sửa cấu trúc bảng

Thông thường, khóa chính sẽ được tạo trong lúc tạo bảng. Tuy nhiên, có lúc bảng đã được tạo rồi nhưng chưa có khóa chính, ta sẽ thêm khóa chính vào bằng cách sửa cấu trúc bảng.

ALTER TABLE table_name
ADD PRIMARY KEY (column_name);

Trường hợp khóa chính được ghép bằng nhiều cột

ALTER TABLE table_name
ADD CONSTRAINT primary_key_name PRIMARY KEY (column_name1,column_name2,....);

Xóa khóa chính

Để xóa khóa chính trong bảng, chúng ta sử dụng câu lệnh dưới đây:

ALTER TABLE table_name
DROP PRIMARY KEY;
0