PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Mệnh đề KIỂM TRA cho các chế độ xem có thể cập nhật

Do Giuseppe Broccolo viết kịch bản

Kể từ PostgreSQL 9.3, có thể cập nhật và chèn trực tiếp vào các chế độ xem, miễn là chế độ xem chỉ tham chiếu đến một bảng bên dưới.

PostgreSQL 9.4 cho phép chúng ta sử dụng mệnh đề CHECK cho INSERT vào các khung nhìn có thể cập nhật. Ví dụ, hãy xem xét một bảng chỉ bao gồm một cột số nguyên; và xem xét hai chế độ xem, một trên các số chia hết cho 2 và một trên các số chia hết cho 3. Nếu chúng ta cố gắng chèn số 123 vào chế độ xem thứ nhất:

—-

$ TẠO BẢNG some_data (id int4 PRIMARY KEY);

TẠO BẢNG

$ TẠO XEM TRƯỚC KHI CHỌN * TỪ some_data WHERE 0 =id% 2;

TẠO CHẾ ĐỘ XEM

$ TẠO XEM thứ hai NHƯ CHỌN * TỪ some_data WHERE 0 =id% 3;

TẠO CHẾ ĐỘ XEM

$ CHÈN VÀO GIÁ TRỊ (id) đầu tiên (123);

—-

Nó sẽ được chèn vào bảng bên dưới, mặc dù chế độ xem chỉ dành cho các số chia hết cho 2 (vì vậy giá trị mới sẽ không hiển thị trong chế độ xem). Trong PostgreSQL 9.4, mệnh đề CHECK đã được giới thiệu để quản lý đúng các INSERT vào các khung nhìn bằng cách kiểm tra trước xem các giá trị có tương thích với định nghĩa của khung nhìn hay không.

Có hai lựa chọn khả thi:

* CASCADED CHECK - đây là tùy chọn mặc định, nơi kiểm tra phân tầng đối với các chế độ xem khác được xác định trên cùng một bảng cơ sở

* KIỂM TRA ĐỊA PHƯƠNG - chỉ chế độ xem là mục tiêu của CHÈN mới được kiểm tra

Dưới đây là cách sử dụng mệnh đề CHECK trong ví dụ trên:

—-

$ DROP XEM trước;

DROP XEM

$ DROP VIEW thứ hai;

DROP XEM

$ TẠO CHẾ ĐỘ XEM trước tiên NHƯ CHỌN * TỪ some_data WHERE 0 =id% 2 VỚI CHỌN KIỂM TRA;

TẠO CHẾ ĐỘ XEM

$ TẠO XEM thứ hai NHƯ CHỌN * TỪ some_data WHERE 0 =id% 3 VỚI CHỌN KIỂM TRA;

TẠO CHẾ ĐỘ XEM

$ TẠO XEM thứ ba NHƯ CHỌN * TỪ ĐẦU ĐÂU 0 =id% 3 VỚI LỰA CHỌN KIỂM TRA;

TẠO CHẾ ĐỘ XEM

$ CHÈN VÀO GIÁ TRỊ (id) đầu tiên (14);

CHÈN 0 1

$ CHÈN VÀO GIÁ TRỊ (id) đầu tiên (15);

LỖI:hàng mới vi phạm VỚI LỰA CHỌN KIỂM TRA cho chế độ xem “đầu tiên”

$ CHÈN VÀO GIÁ TRỊ (id) thứ hai (15);

CHÈN 0 1

$ CHÈN VÀO GIÁ TRỊ (id) thứ ba (6);

CHÈN 0 1

$ CHÈN VÀO GIÁ TRỊ (id) thứ ba (15);

LỖI:hàng mới vi phạm VỚI LỰA CHỌN KIỂM TRA cho chế độ xem “đầu tiên”

Lưu ý rằng chế độ xem “thứ ba” được xác định trên chế độ xem “đầu tiên”.

Giá trị '14' được chèn chính xác trong chế độ xem đầu tiên, trong khi giá trị '15' chỉ có thể được chèn vào thứ hai, không phải đầu tiên - như mong đợi. Chúng ta có thể chèn "6" vào chế độ xem thứ ba vì nó chia hết cho cả 3 và 2. Lỗi khi chèn '15' vào chế độ xem thứ ba mặc dù nó chia hết cho 3 là vì nó vi phạm mệnh đề KIỂM TRA chia hết cho 2. trên chế độ xem gốc, trước tiên. Trong trường hợp này, việc sử dụng mệnh đề KIỂM TRA ĐỊA PHƯƠNG trong cả hai chế độ xem để giải quyết vấn đề là không đủ:

—-

$ DROP XEM trước;

DROP XEM

$ DROP VIEW thứ ba;

DROP XEM

$ TẠO CHẾ ĐỘ XEM trước tiên NHƯ CHỌN * TỪ some_data WHERE 0 =id% 2 VỚI LỰA CHỌN KIỂM TRA ĐỊA PHƯƠNG;

TẠO CHẾ ĐỘ XEM

$ TẠO XEM thứ ba NHƯ CHỌN * TỪ ĐẦU ĐÂU 0 =id% 3 VỚI LỰA CHỌN KIỂM TRA ĐỊA PHƯƠNG;

TẠO CHẾ ĐỘ XEM

$ CHÈN VÀO GIÁ TRỊ (id) thứ ba (15);

LỖI:hàng mới vi phạm VỚI LỰA CHỌN KIỂM TRA cho chế độ xem “đầu tiên”

—-

Ví dụ làm việc được hiển thị ở đây:

—-

$ DROP XEM trước;

DROP XEM

$ DROP VIEW thứ ba;

DROP XEM

$ TẠO XEM TRƯỚC KHI CHỌN * TỪ some_data WHERE 0 =id% 2;

TẠO CHẾ ĐỘ XEM

$ TẠO XEM thứ ba NHƯ CHỌN * TỪ ĐẦU ĐÂU 0 =id% 3 VỚI TÙY CHỌN KIỂM TRA ĐỊA PHƯƠNG;

TẠO CHẾ ĐỘ XEM

$ CHÈN VÀO GIÁ TRỊ (id) thứ ba (15);

CHÈN 0 1

—-

Kết luận

Cơ chế kiểm tra mới này có thể được áp dụng trực tiếp trên các khung nhìn có thể cập nhật trong giai đoạn INSERT. Nó ngày càng củng cố vai trò của cơ sở dữ liệu trong việc duy trì tính toàn vẹn của dữ liệu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. In ra màn hình trong tệp .sql postgres

  2. Lỗi:Cột không tồn tại

  3. Làm thế nào để hiển thị hàm, thủ tục, kích hoạt mã nguồn trong postgresql?

  4. ComboBox.ValueMember và DisplayMember

  5. Làm cách nào để sử dụng truy vấn có trình giữ chỗ bên trong dấu ngoặc kép? (perl / postgresql)