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

Chúng ta có thể cập nhật các giá trị khóa chính của một bảng không?

Người ta thường đồng ý rằng các khóa chính phải là bất biến (hoặc càng ổn định càng tốt vì tính bất biến không thể được thực thi trong DB). Mặc dù không có gì ngăn cản bạn cập nhật khóa chính (ngoại trừ ràng buộc toàn vẹn), nhưng đó có thể không phải là ý kiến ​​hay:

Từ quan điểm hiệu suất:

  • Bạn sẽ cần cập nhật tất cả các khóa ngoại tham chiếu đến khóa đã cập nhật. Một bản cập nhật duy nhất có thể dẫn đến việc cập nhật rất nhiều bảng / hàng tiềm năng.
  • Nếu các khóa ngoại không được lập chỉ mục (!!), bạn sẽ phải duy trì một khóa trên bảng con để đảm bảo tính toàn vẹn. Oracle sẽ chỉ giữ khóa trong một thời gian ngắn nhưng điều này thật đáng sợ.
  • Nếu các khóa ngoại của bạn được lập chỉ mục (đúng như vậy), việc cập nhật sẽ dẫn đến việc cập nhật chỉ mục (xóa + chèn trong cấu trúc chỉ mục), điều này thường đắt hơn so với cập nhật thực tế của bảng cơ sở.
  • Trong bảng CHỈ SỐ TỔ CHỨC (trong các RDBMS khác, xem khóa chính được phân nhóm), các hàng được sắp xếp vật lý theo khóa chính. Cập nhật hợp lý sẽ dẫn đến xóa + chèn vật lý (đắt hơn)

Các cân nhắc khác:

  • Nếu khóa này được tham chiếu trong bất kỳ hệ thống bên ngoài nào (bộ đệm ứng dụng, một DB khác, xuất ...), tham chiếu sẽ bị hỏng khi cập nhật.
  • bổ sung, một số RDBMS không hỗ trợ CASCADE UPDATE, đặc biệt là Oracle.

Tóm lại, trong quá trình thiết kế, thường an toàn hơn khi sử dụng khóa thay thế thay cho khóa chính tự nhiên được cho là không thay đổi - nhưng cuối cùng có thể cần phải cập nhật vì các yêu cầu đã thay đổi hoặc thậm chí là lỗi nhập dữ liệu.

Nếu bạn nhất thiết phải cập nhật khóa chính với bảng con, hãy xem bài đăng này của Tom Kyte để biết giải pháp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Quá trình nâng cấp từng bước lên R12.2 Nâng cấp phần -3

  2. AWS Python Lambda với Oracle

  3. Giải pháp cho ORA-00997:sử dụng bất hợp pháp kiểu dữ liệu LONG

  4. Ví dụ cho con trỏ PLSQL - Con trỏ rõ ràng, ngầm định và tham chiếu

  5. Đếm số hàng đã nối trong phép nối bên trái