PostgreSQL - CONSTRAINTS
Ràng buộc là các quy tắc được thực thi trên các cột dữ liệu trên bảng. Chúng được sử dụng để ngăn dữ liệu không hợp lệ được nhập vào cơ sở dữ liệu. Điều này đảm bảo tính chính xác và độ tin cậy của dữ liệu trong cơ sở dữ liệu.
Các ràng buộc có thể là cấp cột hoặc cấp bảng. Các ràng buộc mức cột chỉ được áp dụng cho một cột trong khi các ràng buộc mức bảng được áp dụng cho toàn bộ bảng. Việc xác định kiểu dữ liệu cho một cột tự nó là một ràng buộc. Ví dụ, một cột kiểu DATE ràng buộc cột đó thành những ngày hợp lệ.
Sau đây là các ràng buộc thường được sử dụng có sẵn trong PostgreSQL.
NOT NULL Constraint - Đảm bảo rằng một cột không thể có giá trị NULL.
UNIQUE Constraint - Đảm bảo rằng tất cả các giá trị trong một cột là khác nhau.
PRIMARY Key - Nhận dạng duy nhất từng hàng / bản ghi trong bảng cơ sở dữ liệu.
FOREIGN Key - Ràng buộc dữ liệu dựa trên các cột trong các bảng khác.
CHECK Constraint - Ràng buộc CHECK đảm bảo rằng tất cả các giá trị trong một cột thỏa mãn các điều kiện nhất định.
EXCLUSION Constraint - Ràng buộc EXCLUDE đảm bảo rằng nếu hai hàng bất kỳ được so sánh trên (các) cột hoặc (các) biểu thức được chỉ định bằng cách sử dụng (các) toán tử được chỉ định, thì không phải tất cả các so sánh này đều trả về TRUE.
Ràng buộc KHÔNG ĐẦY ĐỦ
Theo mặc định, một cột có thể chứa giá trị NULL. Nếu bạn không muốn một cột có giá trị NULL, thì bạn cần xác định ràng buộc như vậy trên cột này, xác định rằng NULL bây giờ không được phép cho cột đó. Ràng buộc NOT NULL luôn được viết dưới dạng ràng buộc cột.
NULL không giống như không có dữ liệu; đúng hơn, nó đại diện cho dữ liệu không xác định.
Thí dụ
Ví dụ: câu lệnh PostgreSQL sau đây tạo một bảng mới có tên COMPANY1 và thêm năm cột, ba trong số đó, ID và NAME và AGE, chỉ định không chấp nhận giá trị NULL -
CREATE TABLE COMPANY1(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Hạn chế duy nhất
Ràng buộc DUY NHẤT ngăn hai bản ghi có các giá trị giống nhau trong một cột cụ thể. Ví dụ: trong bảng COMPANY, bạn có thể muốn ngăn hai hoặc nhiều người có cùng độ tuổi.
Thí dụ
Ví dụ: câu lệnh PostgreSQL sau đây tạo một bảng mới có tên COMPANY3 và thêm năm cột. Ở đây, cột TUỔI được đặt thành DUY NHẤT, do đó bạn không thể có hai bản ghi có cùng độ tuổi -
CREATE TABLE COMPANY3(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL UNIQUE,
ADDRESS CHAR(50),
SALARY REAL DEFAULT 50000.00
);
Ràng buộc CHÍNH CHÍNH
Ràng buộc PRIMARY KEY xác định duy nhất từng bản ghi trong bảng cơ sở dữ liệu. Có thể có nhiều cột DUY NHẤT, nhưng chỉ có một khóa chính trong bảng. Khóa chính rất quan trọng khi thiết kế bảng cơ sở dữ liệu. Khóa chính là id duy nhất.
Chúng tôi sử dụng chúng để tham chiếu đến các hàng trong bảng. Khóa chính trở thành khóa ngoại trong các bảng khác, khi tạo quan hệ giữa các bảng. Do 'giám sát mã hóa lâu đời', khóa chính có thể là NULL trong SQLite. Đây không phải là trường hợp của các cơ sở dữ liệu khác
Khóa chính là một trường trong bảng, xác định duy nhất mỗi hàng / bản ghi trong bảng cơ sở dữ liệu. Khóa chính phải chứa các giá trị duy nhất. Một cột khóa chính không được có giá trị NULL.
Một bảng chỉ có thể có một khóa chính, có thể bao gồm một hoặc nhiều trường. Khi nhiều trường được sử dụng làm khóa chính, chúng được gọi làcomposite key.
Nếu một bảng có khóa chính được xác định trên (các) trường bất kỳ, thì bạn không thể có hai bản ghi có cùng giá trị của (các) trường đó.
Thí dụ
Bạn đã thấy nhiều ví dụ khác nhau ở trên, nơi chúng tôi đã tạo bảng COMAPNY4 với ID là khóa chính -
CREATE TABLE COMPANY4(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Ràng buộc NGOẠI KHÓA
Ràng buộc khóa ngoại chỉ định rằng các giá trị trong một cột (hoặc một nhóm cột) phải khớp với các giá trị xuất hiện trong một số hàng của bảng khác. Chúng tôi nói rằng điều này duy trì tính toàn vẹn tham chiếu giữa hai bảng có liên quan. Chúng được gọi là khóa ngoại vì các ràng buộc là ngoại; nghĩa là, bên ngoài bảng. Khóa ngoại đôi khi được gọi là khóa tham chiếu.
Thí dụ
Ví dụ: câu lệnh PostgreSQL sau đây tạo một bảng mới có tên COMPANY5 và thêm năm cột.
CREATE TABLE COMPANY6(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Ví dụ: câu lệnh PostgreSQL sau đây tạo một bảng mới có tên là DEPARTMENT1, bảng này thêm ba cột. Cột EMP_ID là khóa ngoại và tham chiếu đến trường ID của bảng COMPANY6.
CREATE TABLE DEPARTMENT1(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT references COMPANY6(ID)
);
Ràng buộc KIỂM TRA
Ràng buộc CHECK cho phép một điều kiện để kiểm tra giá trị đang được nhập vào bản ghi. Nếu điều kiện đánh giá là false, bản ghi vi phạm ràng buộc và không được nhập vào bảng.
Thí dụ
Ví dụ: câu lệnh PostgreSQL sau đây tạo một bảng mới có tên COMPANY5 và thêm năm cột. Ở đây, chúng tôi thêm cột KIỂM TRA với LƯƠNG, do đó bạn không thể có bất kỳ LƯƠNG nào là 0.
CREATE TABLE COMPANY5(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL CHECK(SALARY > 0)
);
Ràng buộc LOẠI TRỪ
Các ràng buộc loại trừ đảm bảo rằng nếu hai hàng bất kỳ được so sánh trên các cột hoặc biểu thức được chỉ định bằng cách sử dụng các toán tử được chỉ định, thì ít nhất một trong các so sánh toán tử này sẽ trả về false hoặc null.
Thí dụ
Ví dụ: câu lệnh PostgreSQL sau đây tạo một bảng mới có tên COMPANY7 và thêm năm cột. Ở đây, chúng tôi thêm một ràng buộc EXCLUDE -
CREATE TABLE COMPANY7(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT,
AGE INT ,
ADDRESS CHAR(50),
SALARY REAL,
EXCLUDE USING gist
(NAME WITH =,
AGE WITH <>)
);
Ở đây, USING gist là loại chỉ mục để xây dựng và sử dụng để thực thi.
Bạn cần thực hiện lệnh CREATE EXTENSION btree_gist , một lần cho mỗi cơ sở dữ liệu. Thao tác này sẽ cài đặt phần mở rộng btree_gist, phần mở rộng này xác định các ràng buộc loại trừ trên các kiểu dữ liệu vô hướng đơn giản.
Vì chúng tôi đã thực thi tuổi phải giống nhau, chúng ta hãy xem điều này bằng cách chèn các bản ghi vào bảng -
INSERT INTO COMPANY7 VALUES(1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY7 VALUES(2, 'Paul', 32, 'Texas', 20000.00 );
INSERT INTO COMPANY7 VALUES(3, 'Paul', 42, 'California', 20000.00 );
Đối với hai câu lệnh INSERT đầu tiên, các bản ghi được thêm vào bảng COMPANY7. Đối với câu lệnh INSERT thứ ba, lỗi sau được hiển thị:
ERROR: conflicting key value violates exclusion constraint "company7_name_age_excl"
DETAIL: Key (name, age)=(Paul, 42) conflicts with existing key (name, age)=(Paul, 32).
Ràng buộc bỏ qua
Để loại bỏ một ràng buộc, bạn cần biết tên của nó. Nếu biết tên thì rất dễ rớt. Ngoài ra, bạn cần tìm ra tên do hệ thống tạo. Lệnh psql \ d tên bảng có thể hữu ích ở đây. Cú pháp chung là -
ALTER TABLE table_name DROP CONSTRAINT some_name;