Hướng dẫn primary key mysql - khóa chính mysql

Mỗi table thông thường sẽ có một khóa chính nhằm phân biệt dữ liệu giữa các record trong table. Khi làm các ứng dụng website và để tối ưu tốc độ truy vấn thì thông thường chúng ta sẽ chọn khóa chính là kiểu

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id]
] ENGINE = INNODB;
4 và thiết lập tăng tự động, nghĩa là khi bạn thêm một dòng dữ liệu thì không cần phải truyền khóa chính mà nó sẽ tự động tăng lên 1 khi thêm mới.

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.freetuts.net, không được copy dưới mọi hình thức.

1. Đặc điểm của khóa chính [Primary key]

Giả sử chúng ta có bảng

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id]
] ENGINE = INNODB;
5 và mỗi sinh viên là một record, lúc này để nhận phân biệt giữa các sinh viên thì ta không thể dựa vào tên của sinh viên được vì tên sinh viên có thể trùng nhau. Chính vì vậy ta chọn giải pháp là ta thêm một field
CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id]
] ENGINE = INNODB;
6 dùng để làm khóa chính và giá trị của nó là duy nhất nên có thể phân biệt giữa các sinh viên với nhau.

Sau đây là một số đặc điểm của khóa chính trong MySQL nói chung và trong các mô hình CSDL nói riêng:

  • Giá trị của khóa chính là duy nhất cho mỗi record, nghĩa là không thể tồn tại hai record trùng khóa chính
  • Khóa chính không thể cho phép
    CREATE TABLE users [
      id INT[10] UNSIGNED NOT NULL,
      email VARCHAR[70] NOT NULL,
      PRIMARY KEY[id]
    ] ENGINE = INNODB;
    7 .
  • Mỗi bảng chỉ tồn tại duy nhất một khóa chính, mỗi khóa chính có thể có nhiều column.mỗi khóa chính có thể có nhiều column.

Bởi vì trong MySQL hoạt động với kiểu số sẽ nhanh hơn kiểu chuỗi nên ta sẽ chọn kiểu

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id]
] ENGINE = INNODB;
8, sau khi chạy code tạo khóa chính thì nó sẽ tạo một chỉ mục có tên là
CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id]
] ENGINE = INNODB;
9và đây chính là chỉ mục khóa chính.

Bài viết này được đăng tại [free tuts .net]

2. Tạo khóa chính [Primary key] trong MySQL

Thông thường chúng ta có hai cách tạo khóa chính đó là tạo luôn trong quá trình tạo bảng [create table] hoặc là tạo bảng trước rồi tạo khóa chính sau. Sau đây là các ví dụ về hai cách này.

Tạo trong lệnh tạo bảng Create Table

Để chọn field cho khóa chính ta sẽ đặt từ khóa primary key đằng sau column đó, ví dụ:primary key đằng sau column đó, ví dụ:

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL PRIMARY KEY,
  email VARCHAR[70] NOT NULL
] ENGINE = INNODB;

Hoặc ta sẽ dùng lệnh 

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
0  đặt ở cuối các fields trong lệnh tạo bảng, ví dụ:

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id]
] ENGINE = INNODB;

Chọn nhiều fields làm khóa chính

Để chọn nhiều fields làm khóa chính thì ta sử dụng lệnh 

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
1và đặt nó ở cuối danh sách các field trong lệnh tạo bảng, ví dụ:
CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
1và đặt nó ở cuối danh sách các field trong lệnh tạo bảng, ví dụ:

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;

 Sử dụng lệnh alter để tạo khóa chính

Thông thường cách này sử dụng trong trường hợp ta tạo bảng trước rồi sau đó tạo khóa chính sau. Ta sẽ sử dụng cú pháp sau để tạo:

ALTER TABLE table_name ADD PRIMARY KEY[primary_key_column];

Ví dụ::

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL
] ENGINE = INNODB;

ALTER TABLE users ADD PRIMARY KEY[id]

Sử dụng CONSTRAINT đặt tên cho khóa chính

Cách này khuyến khích sử dụng khi sử dụng lệnh 

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
2 chúng ta có thể tạo tên cho khóa chính, nhờ đó sau này ta sẽ dễ quản lý hơn. Sau đây là một số ví dụ sử dụng 
CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
2 để tạo khóa chính:khuyến khích sử dụng khi sử dụng lệnh 
CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
2 chúng ta có thể tạo tên cho khóa chính, nhờ đó sau này ta sẽ dễ quản lý hơn. Sau đây là một số ví dụ sử dụng 
CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
2 để tạo khóa chính:

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  CONSTRAINT pk_user PRIMARY KEY[id]
] ENGINE = INNODB;

Hoặc::

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL
] ENGINE = INNODB;

ALTER TABLE users ADD CONSTRAINT pk_user PRIMARY KEY [id]

3. Xóa khóa chính [Drop Primary Key]

Để xóa khóa chính thì chúng ta sử dụng lệnh

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
4 kết hợp với
CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
5, ví dụ:

ALTER TABLE users DROP PRIMARY KEY

4. Lời kết

Chúng ta chỉ sử dụng hai cách trên để tạo khóa chính tron MySQL thôi, và không chỉ có ở MySQL mà ở SQL Server cũng có cú pháp tương tự vì chúng để sử dụng ngôn ngữ

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
6. Bài tiếp theo chúng ta sẽ tìm hiểu một loại index cũng tương tự như khóa chính đó là
CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id, email]
] ENGINE = INNODB;
7.

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
Tần Thúc Bảo 
Nguyễn Thành Nhân

Tần Thúc Bảo 

Trình Giảo Kim

La Thành 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 Tần Thúc Bảo 
106 Nguyễn Thành Nhân

Tần Thúc Bảo 

Trình Giảo Kim Mssv làm khóa chính

La Thành

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ơ'];

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. 

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

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:

Mssvhọ tên và địa chỉ nhà làm khóa chính

Tần Thúc Bảo

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 users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id]
] ENGINE = INNODB;
0

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.

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id]
] ENGINE = INNODB;
1

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

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id]
] ENGINE = INNODB;
2

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:

CREATE TABLE users [
  id INT[10] UNSIGNED NOT NULL,
  email VARCHAR[70] NOT NULL,
  PRIMARY KEY[id]
] ENGINE = INNODB;
3

Bài Viết Liên Quan

Chủ Đề