Khái niệm bảng được bảo quản chính là gì?


12

Tôi đã đọc trong Tài liệu Oracle về bảng được bảo quản khóa trong phần Cập nhật phần xem tham gia.

Tuy nhiên, tôi không tìm thấy cách đơn giản nào để hiểu nó.

Tôi hy vọng sẽ nhận được một số chi tiết khái niệm đơn giản khác với Tài liệu chính thức của Oracle.


1
Bạn đã thấy điều này trên AskTom chưa?
Jack nói hãy thử topanswers.xyz

Đây là một lời giải thích khác khiến tôi hiểu khái niệm khó hiểu này: dba.stackexchange.com/questions/38728/ Khăn
Vadzim

Câu trả lời:


7

Khóa được bảo tồn có nghĩa là 1 giá trị khóa đi đến 1 bảng. Đưa ra các ví dụ truy cập có thể giúp bạn hiểu khái niệm này tốt hơn.

Ví dụ 1:

Quan điểm của bạn chứa tập hợp. Giả sử bạn có cấu trúc xem sau.

GroupID, AverageSalary
1 , 10000
2, 12000
3, 14000

Trong ví dụ này: các giá trị của bạn đến từ nhiều hơn một hàng. Nếu bạn cố cập nhật AverageSalary trong chế độ xem này, cơ sở dữ liệu không có cách nào để tìm hàng WHICH để cập nhật.

Ví dụ2: Khung nhìn của bạn hiển thị các giá trị từ nhiều hơn một bảng. Chế độ xem của bạn hiển thị các giá trị từ bảng PERSON và PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue).

Hàng ví dụ:

 1,1,email,ddd@example.com
 1,1,phone,898-98-99

Bạn tham gia 2 bảng này và hiển thị thêm thông tin thân thiện với doanh nghiệp.

PersonId, Tên, Họ, Điện thoại1, Email1

Tại đây bạn muốn cập nhật Phone1 và Email1. Nhưng personID của bạn ánh xạ tới hai hàng khác nhau, có thể là nhiều hàng hơn, trong ví dụ này. Theo quan điểm này, một lần nữa, cơ sở dữ liệu không có cách nào để tìm các hàng WHICH để cập nhật.

Lưu ý: Nếu bạn hạn chế chế độ xem sql của bạn và làm cho nó rõ ràng để tìm hàng nào để cập nhật nó có thể hoạt động.

Hai ví dụ này là ví dụ đầu tiên xuất hiện trong tâm trí của tôi. Chúng có thể được tăng lên. Nhưng khái niệm là rõ ràng. Cơ sở dữ liệu cần ánh xạ 1 giá trị chính vào 1 bảng. Ví dụ: bạn có một đến một bảng PERSON_DETAILS. Ở đây xem và cập nhật sẽ hoạt động vì nó là một.


Nếu bảng bạn muốn cập nhật có chứa khóa chính tổng hợp thì sao?
johny tại sao

7

Các tài liệu bạn đã đọc nói rằng nó khá tốt. Để giải thích thêm:

Khái niệm về một bảng được bảo tồn khóa là cơ bản để hiểu các hạn chế trong việc sửa đổi các khung nhìn tham gia.

Thông thường một updatehành động trên một bảng duy nhất. Để tránh các truy vấn con quanh co trong bộ lọc, Oracle cho phép bạn updatexem (hoặc truy vấn phụ) miễn là vẫn có thể dễ dàng ánh xạ các thay đổi bạn đang thực hiện lên các hàng bên dưới thực trong bảng. Điều này có thể nếu setmệnh đề chỉ sửa đổi các cột trong bảng 'khóa được bảo tồn':

Một bảng được bảo toàn khóa nếu mọi khóa của bảng cũng có thể là khóa của kết quả của phép nối. Vì vậy, một bảng được bảo quản khóa có các khóa được bảo quản thông qua nối.

Ví dụ:

create table foo( foo_id integer primary key, foo_val integer not null );
create table bar( bar_id integer primary key, bar_val integer not null, 
                  foo_id integer not null references foo );

update (select * from foo join bar using(foo_id)) set foo_val=1;
ORA-01779: cannot modify a column which maps to a non key-preserved table

update (select * from foo join bar using(foo_id)) set bar_val=1;
0 rows updated.

bản cập nhật đầu tiên không thành công vì Oracle không có cách nào 1: 1 bản đồ foo_valtrong truy vấn để foo_valfoo- ngược lại bản cập nhật thứ hai thành công bởi vì Oracle có thể 1: 1 bản đồ từng bar_valđến bar_valtrong bar. Điều quan trọng foo_idlà duy nhất trong foo- vì vậy, đối với mỗi hàng trong bar, chỉ có thể có tối đa một hàng tương ứng trong foo(thực tế chính xác là 1 trong ví dụ này, nhưng áp dụng tương tự cho khóa ngoại không có giá trị - điểm quan trọng là không bao giờ có nhiều hơn một hàng).


3

Hãy để tôi đưa ra một ví dụ đầu tiên và giải thích nó sau. Xem xét 2 bảng Sinh viên (t_students) và Khóa học (t_cference).

  • Bảng sinh viên (stundentid, name, Courseid) có khóa chính trên ID sinh viên.
  • Bảng khóa học (Courseid, coursename) có khóa chính trên ID khóa học.

Khi hai bảng này được nối ->

select * from t_students S, t_course C where S.courseid=C.courseid; 

Dữ liệu kết quả sẽ có chính xác cùng số lượng hàng với bảng Sinh viên. Sẽ không có giá trị trùng lặp của studentid trong tập kết quả (studentid được bảo tồn). Tuy nhiên, mặc dù khóa học là duy nhất trong bảng khóa học, nó sẽ được lặp lại nhiều lần trong tập kết quả, vì nhiều sinh viên có thể đã chọn cho cùng một khóa học (nói cách khác, khóa học không được bảo tồn).

Với ví dụ này, bạn có thể đi đến kết luận rằng:

  • Mỗi khóa trong bảng cơ sở đóng vai trò là khóa của dữ liệu kết quả sau khi tham gia (studentid)
  • Các hàng từ hàng cơ sở xuất hiện trong dữ liệu kết quả tối đa chỉ một lần. (Không có hàng trùng lặp)

Đây là khái niệm về Bàn được bảo quản chính.

Để biết các cột xem có thể cập nhật được không,

select * from all_updatable_columns where table_name='V_VIEW_NAME';

PS: cung cấp bảng / tên xem bằng chữ VỐN.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.