Ngày 20 tháng 10 năm 2023 - Máy tính
Tính năng kế thừa được lấy cảm hứng từ khái niệm cơ sở dữ liệu hướng đối tượng, mang lại những khả năng mới trong thiết kế cơ sở dữ liệu.
Hãy xem một ví dụ: Giả sử chúng ta đang xây dựng một mô hình dữ liệu để lưu trữ thông tin về tất cả các thành phố, trong đó có thành phố thông thường và thành phố thủ phủ. Làm thế nào để rw88 thiết kế bảng? Tính năng kế thừa có thể biểu diễn mối quan hệ này một cách khéo léo.
Dưới đây là câu lệnh tạo bảng:
-- Bảng thành phố
CREATETABLEthanhpho(tenthanhphovarchar(100)PRIMARYKEY,-- tên
dancosothuchienthoatfloat8,-- dân số, đơn vị triệu
chieucaotbints,-- độ cao trung bình, đơn vị mét [tải game 789 club tài xỉu](/post/what-is-power-platfor/)
tinhvarchar(100)-- tỉnh
);-- Bảng thủ phủ
CREATETABLEthufu()INHERITS(thanhpho);
Bảng thufu
đã kế thừa tất cả các cột của bảng thanhpho
.
Chèn một số dữ liệu mẫu:
-- Chèn dữ liệu vào bảng thành phố
INSERTINTOthanhphoVALUES('Đại Liên',7.51,40,'Liêu Ninh');INSERTINTOthanhphoVALUES('Bàn Cẩm',1.39,4,'Liêu Ninh');INSERTINTOthanhphoVALUES('Triều Dương',2.79,160,'Liêu Ninh');-- Chèn dữ liệu vào bảng thủ phủ
INSERTINTOthufuVALUES('Thẩm Dương',9.14,50,'Liêu Ninh');
Lưu ý rằng với các câu lệnh chèn trên, cần thực hiện riêng lẻ cho từng bảng, ngay cả khi hai bảng có cấu trúc khác nhau. Lệnh INSERT
không hỗ trợ việc chỉ chèn vào bảng cha mà tự động tìm kiếm bảng con tương ứng (cũng giống như lệnh COPY
).
Trong PostgreSQL, một bảng có thể f8bet5.com kế thừa 0 hoặc nhiều bảng khác. Khi truy vấn, bạn có thể chỉ truy vấn dữ liệu của một bảng duy nhất hoặc truy vấn dữ liệu của một bảng cùng tất cả các bảng kế thừa của nó.
Câu truy vấn sau sẽ trả về tất cả dữ liệu bao gồm cả bảng thufu
:
test=# SELECT * FROM thanhpho;
tenthanpho | dancosothuchienthoat | chieucaotbin | tinh
-------------+----------------------+--------------+---------
Đại Liên | 7.51 | 40 | Liêu Ninh
Bàn Cẩm | 1.39 | 4 | Liêu Ninh
Triều Dương | 2.79 | 160 | Liêu Ninh
Thẩm Dương | 9.14 | 50 | Liêu Ninh
(4 dòng)
Trong khi đó, câu truy vấn sau chỉ trả về dữ liệu của bảng thanhpho
:
test=# SELECT * FROM ONLY thanhpho;
tenthanpho | dancosothuchienthoat | chieucaotbin | tinh
-------------+----------------------+--------------+---------
Đại Liên | 7.51 | 40 | Liêu Ninh
Bàn Cẩm | 1.39 | 4 | Liêu Ninh
Triều Dương | 2.79 | 160 | Liêu Ninh
(3 dòng)
Ở đây, từ khóa ONLY
nghĩa là chỉ truy vấn dữ liệu của bảng thanhpho
, không bao gồm dữ liệu từ các bảng kế thừa từ thanhpho
. Ngoài lệnh SELECT
, các lệnh UPDATE
và DELETE
cũng hỗ trợ từ khóa ONLY
(ví dụ: khi thực hiện DELETE FROM ONLY thanhpho;
, chỉ có dữ liệu của bảng thanhpho
bị xóa).
Để biết mỗi dòng cụ thể đến từ bảng nào, bạn có thể sử dụng truy vấn sau:
test=# SELECT p.relname as bang, c.*
test-# FROM thanhpho c, pg_class p
test-# WHERE c.tableoid = p.oid;
bang | tenthanpho | dancosothuchienthoat | chieucaotbin | tinh
------------+-------------+----------------------+--------------+---------
thanhpho | Đại Liên | 7.51 | 40 | Liêu Ninh
thanhpho | Bàn Cẩm | 1.39 | 4 | Liêu Ninh
thanhpho | Triều Dương | 2.79 | 160 | Liêu Ninh
thufu | Thẩm Dương | 9.14 | 50 | Liêu Ninh
(4 dòng)
Mặc định, bảng con sẽ kế thừa tất cả ràng buộc kiểm tra và ràng buộc không rỗng từ bảng cha (trừ khi sử dụng mệnh đề NO INHERIT
để chỉ định rõ ràng những gì không nên kế thừa); tuy nhiên, nó sẽ không kế thừa ràng buộc duy nhất, ràng buộc khóa chính và ràng buộc khóa ngoại.
Do đó, hai câu lệnh chèn trùng lặp sau đây có thể thực thi thành công:
-- Vì ràng buộc khóa chính không được kế thừa, bảng thủ phủ có thể chèn hai dòng dữ liệu trùng lặp
INSERTINTOthufuVALUES('Thẩm Dương',9.14,50,'Liêu Ninh');INSERTINTOthufuVALUES('Thẩm Dương',9.14,50,'Liêu Ninh');
Khi một bảng có thể kế thừa từ nhiều bảng cha, thì các cột của bảng con sẽ bao gồm tập hợp các cột từ tất cả các bảng cha cộng thêm các cột tùy chỉnh. Nếu các bảng cha có cột cùng tên hoặc bảng con và bảng cha có cột cùng tên, các cột này sẽ được gộp lại (các cột cùng tên phải có cùng kiểu dữ liệu, nếu không sẽ báo lỗi). Quy tắc gộp cũng áp dụng cho ràng buộc kiểm tra và ràng buộc không rỗng cùng tên.
Giống như ví dụ trước, tính năng kế thừa thường được thiết lập khi tạo bảng con ban đầu (CREATE TABLE ... INHERITS ...
). Ngoài ra, bạn cũng có thể sử dụng ALTER TABLE ... INHERIT ...
để thiết lập mối quan hệ cha-con cho bảng hiện có. Lúc này, bảng con mới phải chứa tất cả các cột của bảng cha, kiểu dữ liệu phải khớp với bảng cha, và tên cũng như biểu thức kiểm tra của ràng buộc phải khớp với bảng cha. Bạn cũng có thể sử dụng ALTER TABLE ... NO INHERIT ...
để xóa một chuỗi kế thừa khỏi bảng con. Đặc điểm này rất hữu ích khi sử dụng tính năng kế thừa cho phân vùng bảng.
Một cách tiện lợi để tạo bảng tương thích (sẽ trở thành bảng con mới sau này) là sử dụng mệnh đề LIKE
trong CREATE TABLE
. Điều này sẽ tạo ra một bảng có cùng các cột như bảng nguồn. Nếu có bất kỳ ràng buộc kiểm tra nào được định nghĩa trên bảng nguồn, bạn nên chỉ định tùy chọn INCLUDING CONSTRAINTS
của mệnh đề LIKE
, vì bảng con mới phải có các ràng buộc khớp với bảng cha để được coi là tương thích.
Khi bảng cha có bảng con tồn tại, bảng cha không thể bị xóa trực tiếp. Nếu các cột hoặc ràng buộc kiểm tra của bảng con được kế thừa từ bất kỳ bảng cha nào, chúng cũng không thể bị xóa hoặc thay đổi. Nếu muốn xóa bảng cha và tất cả các bảng kế thừa của nó, bạn có thể sử dụng tùy chọn CASCADE
.
Ví dụ:
DROPTABLEthanhphoCASCADE;
Khi thực thi truy vấn kế thừa, chỉ kiểm tra quyền truy cập đối với bảng cha. Ví dụ: nếu bạn được ủy quyền cập nhật bảng thanhpho
, khi truy cập thufu
thông qua thanhpho
, bạn cũng có quyền cập nhật các hàng trong thufu
(như thể dữ liệu đều tồn tại trong bảng cha); nhưng nếu không có quyền bổ sung, thufu
không thể được cập nhật trực tiếp.
Ngoài ra, bảng ngoài cũng có thể kế thừa từ bảng khác hoặc được kế thừa bởi bảng khác.
Tóm lại, bài viết này đã dịch và tổng hợp kiến thức liên quan đến tính năng kế thừa bảng trong tài liệu chính thức của PostgreSQL, mong rằng sau khi đọc xong bài viết này, chúng ta sẽ có một cái nhìn cơ bản về cách sử dụng tính năng kế thừa bảng trong PostgreSQL.
[1] 5.10 Kế thừa - Định nghĩa Dữ liệu | Tài liệu PostgreSQL 16 - www.postgresql.org [2] 3.6 Kế thừa - Các tính năng nâng cao | Tài liệu PostgreSQL 16 - www.postgresql.org [3] Khi nào nên sử dụng bảng kế thừa trong PostgreSQL? | Stack Overflow - stackoverflow.com