Lỗi không cập nhật được khóa chính sql năm 2024

Constraint trong SQL là một quy tắc được áp dụng cho các cột trong bảng để giới hạn dữ liệu được chèn, cập nhật hoặc xóa. Chúng được sử dụng để đảm bảo tính nhất quán và tính toàn vẹn của dữ liệu trong cơ sở dữ liệu. Nhờ các constraint, chúng ta có thể xây dựng một cơ sở dữ liệu ổn định và đáng tin cậy. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về ràng buộc trong SQL và cách sử dụng hiệu quả từng ràng buộc.

1. Ràng buộc(Constraint) trong SQL là gì

Ràng buộc(constraint) trong SQL là các quy tắc được áp dụng trên các dữ liệu của bảng. Chúng được sử dụng để kiểm tra tính hợp lệ của dữ liệu đầu vào, tính chính xác và toàn vẹn của dữ liệu.

2. Các loại Constraint phổ biến

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

6: Constraint này cho biết rằng chúng ta không thể lưu một giá trị

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

7 cho cột đã được gán ràng buộc này. Điều đó có nghĩa là, nếu một cột được định nghĩa là

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

6, cột đó sẽ không thể chấp nhận các giá trị

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

7 được nữa.

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

0: Sử dụng khi chúng ta muốn định nghĩa cho một cột phải có giá trị của nó là duy nhất, nếu một bản ghi đã có giá trị này trong cột của nó thì giá trị đó sẽ không được sử dụng để điền cho bản ghi nào khác trong cơ sở dữ liệu.

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

1: Một primary key(khóa chính) một hoặc một tập các trường có giá trị là duy nhất, có thể được sử dụng để phân biệt giữa các bản ghi với nhau. Việc khai báo các cột khóa chính yêu cầu các cột phải

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

6.

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

3: Dùng để thiết lập khóa ngoại trên bảng, tham chiếu đến bảng khác thông qua giá trị của cột được liên kết. Giá trị của cột được liên kết phải là duy nhất trong bảng kia.

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

4: Giúp kiểm tra tính hợp lệ của đầu vào dữ liệu, điều này đảm bảo tất cả giá trị trong cột đảm bảo một điều kiện nào đó.

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

5: Ràng buộc này định nghĩa một giá trị mặc định cho một cột dữ liệu khi nó không được điền một giá trị cụ thể bởi người dùng

3. Định nghĩa một ràng buộc như thế nào?

Chúng ta có thể thêm một ràng buộc tại thời điểm tạo bảng bằng câu lệnh

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

6. Chúng ta cũng có thể định nghĩa các ràng buộc sau khi đã tạo bảng bằng cách sử dụng câu lệnh

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

7.

Cú pháp thực hiện:

Dưới đây là cú pháp để thực hiện tạo các ràng buộc sử dụng lệnh

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

6.

CREATE TABLE sample_table
(
column1 data_type(size) constraint_name,
column2 data_type(size) constraint_name,
column3 data_type(size) constraint_name,
....
);
ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

9: Tên của bảng cần tạo.

CREATE TABLE Customer (
ID CHAR(10) NOT NULL,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(50) NOT NULL,
PHONE VARCHAR(50) UNIQUE,
DOB DATE
);

0: Kiểu dữ liệu cần được lưu vào trường.

CREATE TABLE Customer (
ID CHAR(10) NOT NULL,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(50) NOT NULL,
PHONE VARCHAR(50) UNIQUE,
DOB DATE
);

1: Tên của ràng buộc, ví dụ như: NOT NULL, UNIQUE, PRIMARY KEY etc.

\>>> Xem thêm bài viết:

- Khai báo và sử dụng mảng các đối tượng trong Java

- Phân biệt ArrayList, Set và Vector trong Java

- Lập trình đa luồng là gì? Hướng dẫn lập trình đa luồng bằng ngôn ngữ Java

4. Tiếp theo chúng ta sẽ tìm hiểu chi tiết về từng ràng buộc

4.1. NOT NULL

Nếu ràng buộc này được sử dụng, có nghĩa là một trường dữ liệu sẽ không nhận NULL làm giá trị của nó. Bạn cũng sẽ không thể điền thêm một bản ghi vào cơ sở dữ liệu mà không điền dữ liệu cho cột đã được định nghĩa là NOT NULL.

Trong ví dụ dưới đây, câu truy vấn(

CREATE TABLE Customer (
ID CHAR(10) NOT NULL,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(50) NOT NULL,
PHONE VARCHAR(50) UNIQUE,
DOB DATE
);

  1. tạo bảng Student với trường

CREATE TABLE Customer (
ID CHAR(10) NOT NULL,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(50) NOT NULL,
PHONE VARCHAR(50) UNIQUE,
DOB DATE
);

3 và

CREATE TABLE Customer (
ID CHAR(10) NOT NULL,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(50) NOT NULL,
PHONE VARCHAR(50) UNIQUE,
DOB DATE
);

4 có ràng buộc NOT NULL. Theo đó, khi chúng ta thêm bản ghi, chúng ta cần đảm bảo hai trường này phải có dữ liệu, nếu không nó sẽ báo lỗi và chúng ta sẽ không được phép thêm bản ghi.

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

Sử dụng ALTER TABLE để thêm ràng buộc

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

4.2. UNIQUE

Ràng buộc này giúp thực hiện việc phân biệt các bản ghi trong một bảng, cụ thể là với một cột nào đó thì các bản ghi trong bảng phải có giá trị cột này khác nhau. Chúng ta có thể thực hiện định nghĩa ràng buộc này trên nhiều cột của một bảng

Chúng ta có thể thêm ràng buộc này khi tạo bảng

CREATE TABLE Customer (
ID CHAR(10) NOT NULL,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(50) NOT NULL,
PHONE VARCHAR(50) UNIQUE,
DOB DATE
);

Hoặc thêm ràng buộc sau khi đã tạo bảng

ALTER TABLE Customer
ADD CONSTRAINT unique_phone UNIQUE (PHONE);

4.3. PRIMARY KEY

Khóa chính là một hoặc nhiều trường thực hiện nhiệm vụ phân biệt các bản ghi trong một bảng. Nếu một trường trong bảng được định nghĩa là primary key thì trường này sẽ không nhận vào giá trị NULL và toàn bộ các dòng sẽ cần trường này có giá trị riêng biệt. Điều này có nghĩa là, khóa chính là kết hợp của hai ràng buộc

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

6 và

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

0.

Khai báo trực tiếp PRIMARY KEY:

CREATE TABLE Property (
ID CHAR(10) PRIMARY KEY,
PROPERTY_NAME VARCHAR(70) NOT NULL,
PROPERTY_TYPE VARCHAR(30),
VALUE MONEY
);

Định nghĩa ràng buộc:

CREATE TABLE Property (
ID CHAR(10),
CONSTRAINT pk_id PRIMARY KEY(ID),
PROPERTY_NAME VARCHAR(70) NOT NULL,
PROPERTY_TYPE VARCHAR(30),
VALUE MONEY
);

Sửa đổi PRIMARY KEY với ALTER TABLE

ALTER TABLE Property
ADD CONSTRAINT pk_prop_id PRIMARY KEY (ID);

4.4. FOREIGN KEY

Foreign key hay khóa ngoài là một trường trong bảng được sử dụng để phân biệt với các dòng của một bảng khác. Điều này có nghĩa là, trường này trỏ tới khóa chính của bảng khác. Việc này thường xuyên tạo một liên kết giữa các bảng với nhau.

Chúng ta hãy cùng đánh giá hai bảng dưới đây

Orders

O_IDORDER_NOC_ID122533233253345212485321

Customers

C_IDNAMEADDRESS1RAMESHDELHI2SURESHNOIDA3DHARMESHGURGAON

Chúng ta có thể thấy được trường

CREATE TABLE Customer (
ID CHAR(10) NOT NULL,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(50) NOT NULL,
PHONE VARCHAR(50) UNIQUE,
DOB DATE
);

7 trong bảng

CREATE TABLE Customer (
ID CHAR(10) NOT NULL,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(50) NOT NULL,
PHONE VARCHAR(50) UNIQUE,
DOB DATE
);

8 là khóa chính của bảng

CREATE TABLE Customer (
ID CHAR(10) NOT NULL,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(50) NOT NULL,
PHONE VARCHAR(50) UNIQUE,
DOB DATE
);

9, nó sẽ thực định danh cho các cột của bảng Customers. Từ đó, chúng ta có thể tạo một khóa phụ cho bảng Orders như sau:

CREATE TABLE Orders
(
O_ID int NOT NULL,
ORDER_NO int NOT NULL,
C_ID int,
PRIMARY KEY (O_ID),
FOREIGN KEY (C_ID) REFERENCES Customers(C_ID)
)

4.5. CHECK

Ràng buộc này được sử dụng để đảm bảo đầu vào dữ liệu của một trường thỏa mãn một điều kiện nào đó. Ở đây chúng ta có thể tham khảo một vài ví dụ sau:

Tạo ràng buộc check trường age > 18, khi tạo bảng


CREATE TABLE Employee
(
ID int(6) PRIMARY KEY,
NAME varchar(10) NOT NULL,
AGE int NOT NULL CHECK (AGE >= 18)
);

Sử dụng

ALTER TABLE Student MODIFY NAME char(10) NOT NULL;

7 để thêm ràng buộc sau khi đã tạo bảng

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

0

4.6. DEFAULT

Ràng buộc này được sử dụng để cung cấp một giá trị mặc định cho trường trong bảng. Điều đó có nghĩa là, tại thời điểm thêm bản ghi mới vào bảng, nếu người dùng không điền giá trị cho các trường hay thì giá trị mặc định sẽ được gán cho các trường này của bản ghi.

Ví dụ dưới đây, chúng ta định nghĩa trường

ALTER TABLE Customer
ADD CONSTRAINT unique_phone UNIQUE (PHONE);

1 của bảng STUDENT sẽ có giá trị mặc định là 18

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

1

Chúng ta cũng có thể thêm ràng buộc sau khi đã tạo bảng bằng lệnh sau:

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

2

4.7. Xóa bỏ, kích hoạt hoặc bỏ kích hoạt một ràng buộc

Cú pháp xóa bỏ:

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

3

Khi không muốn kiểm tra một ràng buộc nữa, chúng ta có thể sử dụng cú pháp:

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

4

Tái kích hoạt ràng buộc bằng cú pháp:

CREATE TABLE Student
(
ID int(6) NOT NULL,
NAME varchar(10) NOT NULL,
ADDRESS varchar(20)
);

5

Kết luận

Trên đây là những gì Stringee tổng hợp và tự đưa ra ví dụ minh họa cho từng phần. Hi vọng sẽ giúp ích cho các bạn trong quá trình sử dụng constraint trong câu lệnh SQL.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy, Adavigo, bTaskee…