Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản kèo bóng đá pháp được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3
Tài liệu này dành cho phiên bản kèo bóng đá pháp được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng kèo bóng đá pháp trang chohiện tạiPhiên bản hoặc kèo bóng đá pháp trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

kèo bóng đá pháp5.3. Hạn chế

Kiểu dữ liệu là một cách để hạn chế loại dữ liệu có thể Được lưu trữ trong một bàn. Đối với nhiều ứng dụng, tuy nhiên, kèo bóng đá pháp Họ cung cấp là quá thô. Ví dụ: một cột chứa một Giá sản phẩm có lẽ chỉ nên chấp nhận các giá trị tích cực. Nhưng Không có loại dữ liệu tiêu chuẩn chỉ chấp nhận tích cực số. Một vấn đề khác là bạn có thể muốn hạn chế cột dữ liệu liên quan đến các cột hoặc hàng khác. Ví dụ, trong một bảng chứa thông tin sản phẩm, chỉ có một hàng cho mỗi số sản phẩm.

Đến cuối đó, SQL cho phép bạn xác định các kèo bóng đá pháp trên các cột và bảng. Các kèo bóng đá pháp cung cấp cho bạn nhiều quyền kiểm soát dữ liệu trong bàn của bạn như bạn muốn. Nếu người dùng cố gắng lưu trữ dữ liệu trong một Cột sẽ vi phạm một kèo bóng đá pháp, một lỗi được nêu ra. Cái này áp dụng ngay cả khi giá trị đến từ giá trị mặc định sự định nghĩa.

5.3.1. Kiểm tra Hạn chế

11409_11652

Tạo sản phẩm bảng (
    sản phẩm_no số nguyên,
    tên văn bản,
    Giá sốKiểm tra (Giá 0)11813_11819

11832_12051Kiểm tratheo sau là một biểu thức trong ngoặc đơn. Các kèo bóng đá pháp kiểm tra Biểu thức nên liên quan đến cột do đó bị hạn chế, nếu không thì kèo bóng đá pháp sẽ không làm quá nhiều giác quan.

12317_12491

Tạo sản phẩm bảng (
    sản phẩm_no số nguyên,
    tên văn bản,
    Giá sốkèo bóng đá pháp tích cực_priceKiểm tra (Giá 0)
);

Vì vậy, để chỉ định một kèo bóng đá pháp được đặt tên, hãy sử dụng từ khóakèo bóng đá pháptheo sau là một định danh theo sau là định nghĩa kèo bóng đá pháp. (Nếu bạn không chỉ định một tên kèo bóng đá pháp theo cách này, hệ thống chọn tên cho Bạn.)

Một kèo bóng đá pháp kiểm tra cũng có thể tham khảo một số cột. Nói bạn lưu trữ một mức giá thường xuyên và giá chiết khấu, và bạn muốn để đảm bảo rằng giá chiết khấu thấp hơn so với thông thường giá:

Tạo sản phẩm bảng (
    sản phẩm_no số nguyên,
    tên văn bản,
    Kiểm tra số giá (Giá 0),
    Trở nên chiết khấu_price kiểm tra số (chiết khấu_price 0),Kiểm tra (Giá Giảm giá_price));

13454_13751

Chúng tôi nói rằng hai kèo bóng đá pháp đầu tiên là cột các kèo bóng đá pháp, trong khi cái thứ ba là một kèo bóng đá pháp bảng bởi vì nó được viết riêng biệt với bất kỳ một cột nào sự định nghĩa. Các kèo bóng đá pháp cột cũng có thể được viết dưới dạng bảng các kèo bóng đá pháp, trong khi điều ngược lại không nhất thiết là có thể, vì một kèo bóng đá pháp cột chỉ được đề cập đến Cột nó được gắn vào. (PostgreSQLkhông thực thi quy tắc đó, nhưng Bạn nên làm theo nó nếu bạn muốn định nghĩa bảng của mình hoạt động với kèo bóng đá pháp hệ thống cơ sở dữ liệu khác.) Ví dụ trên cũng có thể là Viết như:

Tạo sản phẩm bảng (
    sản phẩm_no số nguyên,
    tên văn bản,
    Giá số,
    Kiểm tra (Giá 0),
    giảm chiết khấu_price số,
    Kiểm tra (chiết khấu_price 0),
    Kiểm tra (Giá Giảm giá_price)
);

hoặc thậm chí:

Tạo sản phẩm bảng (
    sản phẩm_no số nguyên,
    tên văn bản,
    Kiểm tra số giá (Giá 0),
    giảm chiết khấu_price số,
    Séc (chiết khấu_price 0 và giá chiết khấu_price)
);

Đó là vấn đề của hương vị.

Tên có thể được gán cho các kèo bóng đá pháp bảng chỉ giống nhau cách đối với các kèo bóng đá pháp cột:

Tạo sản phẩm bảng (
    sản phẩm_no số nguyên,
    tên văn bản,
    Giá số,
    Kiểm tra (Giá 0),
    giảm chiết khấu_price số,
    Kiểm tra (chiết khấu_price 0),kèo bóng đá pháp hợp lệ_discountKiểm tra (Giá Giảm giá_price)
);

15403_15807

5.3.2. Các kèo bóng đá pháp không có null

Một kèo bóng đá pháp không có null chỉ cần chỉ định rằng một cột phải không giả sử giá trị null. Ví dụ về cú pháp:

Tạo sản phẩm bảng (
    Product_No Integerkèo bóng đá pháp null,,
    Tên văn bảnkèo bóng đá pháp null,,
    Giá số
);

Một kèo bóng đá pháp không có Null luôn được viết làm cột kèo bóng đá pháp. Một kèo bóng đá pháp không có null tương đương về mặt chức năng Tạo kèo bóng đá pháp kiểm traKiểm tra (Cột_namekèo bóng đá pháp phải là null),, Nhưng trongPostgreSQLTạo một Rõ ràng không phải là kèo bóng đá pháp không có hiệu quả hơn. Hạn chế là Rằng bạn không thể đưa ra tên rõ ràng cho các kèo bóng đá pháp không null đã tạo theo cách này.

Tất nhiên, một cột có thể có nhiều hơn một kèo bóng đá pháp. Chỉ Viết các kèo bóng đá pháp lần lượt:

Tạo sản phẩm bảng (
    Product_no Integer kèo bóng đá pháp phải NULL,
    Tên văn bản kèo bóng đá pháp phải null,
    Giá số kèo bóng đá pháp kiểm tra null (Giá 0)
);

Thứ tự không quan trọng. Nó không nhất thiết phải xác định theo thứ tự các kèo bóng đá pháp được kiểm tra.

Thekèo bóng đá pháp nullkèo bóng đá pháp có một nghịch đảo: Thenullkèo bóng đá pháp. Cái này không có nghĩa là cột phải là null, chắc chắn sẽ là vô dụng. Thay vào đó, điều này chỉ cần chọn hành vi mặc định Rằng cột có thể là null. Thenullkèo bóng đá pháp không có trong SQL Tiêu chuẩn và không nên được sử dụng trong các ứng dụng di động. (Nó chỉ được thêm vàoPostgreSQLĐể tương thích với một số hệ thống cơ sở dữ liệu khác.) Một số người dùng, Tuy nhiên, giống như nó bởi vì nó giúp bạn dễ dàng chuyển đổi kèo bóng đá pháp trong một tập tin tập lệnh. Ví dụ: bạn có thể bắt đầu với:

Tạo sản phẩm bảng (
    sản phẩm_no số nguyên null,
    tên văn bản null,
    Giá null số
);

và sau đó chènkèo bóng đá phápTừ khóa nơi mong muốn.

Tip:Trong hầu hết kèo bóng đá pháp thiết kế cơ sở dữ liệu, phần lớn kèo bóng đá pháp cột phải được đánh dấu không phải null.

5.3.3. Độc nhất Hạn chế

Các kèo bóng đá pháp duy nhất đảm bảo rằng dữ liệu có trong a cột hoặc một nhóm các cột là duy nhất đối với tất cả Hàng trong bảng. Cú pháp là:

18743_18793độc đáo,,
    tên văn bản,
    Giá số
);

Khi được viết dưới dạng kèo bóng đá pháp cột và:

18952_19041độc đáo (sản phẩm_no));

Khi được viết dưới dạng kèo bóng đá pháp bảng.

Nếu một kèo bóng đá pháp duy nhất đề cập đến một nhóm các cột, Các cột được liệt kê được phân tách bằng dấu phẩy:

Tạo ví dụ bảng (
    kèo bóng đá pháp số nguyên,
    b số nguyên,
    C Số nguyên,độc đáo (a, c));

19415_19606

Bạn có thể gán tên của riêng mình cho một kèo bóng đá pháp duy nhất, trong Cách thông thường:

Tạo sản phẩm bảng (
    Product_No Integerkèo bóng đá pháp phải_be_differentđộc đáo,
    tên văn bản,
    Giá số
);

Nói chung, một kèo bóng đá pháp duy nhất bị vi phạm khi có hai hoặc nhiều hàng trong bảng trong đó các giá trị của tất cả các Các cột bao gồm trong kèo bóng đá pháp là bằng nhau. Tuy nhiên, hai null Giá trị không được coi là bằng nhau trong so sánh này. Điều đó có nghĩa là ngay cả với sự hiện diện của một kèo bóng đá pháp duy nhất, có thể Lưu trữ các hàng trùng lặp có chứa giá trị null trong ít nhất một của các cột bị kèo bóng đá pháp. Hành vi này phù hợp với SQL tiêu chuẩn, nhưng chúng tôi đã nghe nói rằng cơ sở dữ liệu SQL khác có thể không Thực hiện theo quy tắc này. Vì vậy, hãy cẩn thận khi phát triển các ứng dụng được dự định là di động.

5.3.4. Sơ đẳng Chìa khóa

Về mặt kỹ thuật, một kèo bóng đá pháp khóa chính chỉ đơn giản là một Sự kết hợp của một kèo bóng đá pháp độc đáo và một kèo bóng đá pháp không khống. Vì vậy, hai định nghĩa bảng sau đây chấp nhận giống nhau Dữ liệu:

Tạo sản phẩm bảng (
    Product_no Integer độc đáo kèo bóng đá pháp phải NULL,
    tên văn bản,
    Giá số
);
Tạo sản phẩm bảng (
    Product_No IntegerKhóa chính,,
    tên văn bản,
    Giá số
);

Các phím chính cũng có thể hạn chế nhiều hơn một cột; các Cú pháp tương tự như các kèo bóng đá pháp duy nhất:

Tạo ví dụ bảng (
    kèo bóng đá pháp số nguyên,
    b số nguyên,
    C Số nguyên,Khóa chính (A, C));

Một khóa chính chỉ ra rằng một cột hoặc nhóm cột Có thể được sử dụng như một định danh duy nhất cho các hàng trong bảng. (Cái này là hậu quả trực tiếp của định nghĩa của khóa chính. Lưu ý rằng một kèo bóng đá pháp duy nhất không phải là Định danh duy nhất vì nó không loại trừ các giá trị null.) Điều này hữu ích cả cho mục đích tài liệu và cho khách hàng ứng dụng. Ví dụ: một ứng dụng GUI cho phép sửa đổi các giá trị hàng có thể cần phải biết khóa chính của một bảng để có thể xác định các hàng một cách độc đáo.

Bảng có thể có nhiều nhất một khóa chính. (Có thể có bất kỳ số lượng các kèo bóng đá pháp duy nhất và không khống, đó là về mặt chức năng giống nhau, nhưng chỉ có một khóa chính.) Lý thuyết cơ sở dữ liệu quan hệ ra lệnh rằng Mỗi bảng phải có một khóa chính. Quy tắc này không được thi hành quaPostgreSQL, nhưng nó là thường tốt nhất để theo dõi nó.

5.3.5. Chìa khóa nước ngoài

22779_22968Tính toàn vẹn tham chiếugiữa hai kèo bóng đá pháp bảng liên quan.

nói rằng bạn có bảng sản phẩm mà chúng tôi đã sử dụng kèo bóng đá pháp số Thời gian rồi:

Tạo sản phẩm bảng (
    sản phẩm_no khóa chính số nguyên,
    tên văn bản,
    Giá số
);

23281_23555

Tạo đơn đặt hàng bảng (
    Order_id Số nguyên chính, khóa chính,
    Product_No IntegerTài liệu tham khảo Sản phẩm (sản phẩm_no),,
    Số lượng số lượng
);

Bây giờ kèo bóng đá pháp thể tạo đơn đặt hàng vớisản phẩm_nokèo bóng đá pháp mục không xuất hiện trong Bảng sản phẩm.

Chúng tôi nói rằng trong tình huống này, bảng đơn đặt hàng làTham chiếuBảng và kèo bóng đá pháp sản phẩm Bảng làđược tham chiếuBảng. Tương tự, có kèo bóng đá pháp cột tham chiếu và tham chiếu.

Bạn cũng có thể rút ngắn lệnh trên thành:

Tạo đơn đặt hàng bảng (
    Order_id Số nguyên chính, khóa chính,
    Product_No IntegerTài liệu tham khảo Sản phẩm,,
    Số lượng số lượng
);

Vì không có cột liệt kê, khóa chính của khóa chính của Bảng được tham chiếu được sử dụng làm (kèo bóng đá pháp) cột được tham chiếu.

Khóa ngoại cũng có thể kèo bóng đá pháp và tham khảo một nhóm cột. Như thường lệ, sau đó nó cần được viết trong bảng hình thức kèo bóng đá pháp. Đây là một ví dụ về cú pháp giả tạo:

Tạo bảng T1 (
  kèo bóng đá pháp khóa chính số nguyên,
  b số nguyên,
  C Số nguyên,Khóa nước ngoài (b, c) Tài liệu tham khảo khác_table (C1, C2));

Tất nhiên, số và loại của các cột bị kèo bóng đá pháp cần khớp với số và loại của tham chiếu các cột.

Bạn có thể gán tên của riêng mình cho một kèo bóng đá pháp khóa nước ngoài, theo cách thông thường.

Một bảng có thể chứa nhiều hơn một kèo bóng đá pháp khóa nước ngoài. Điều này được sử dụng để thực hiện các mối quan hệ nhiều-nhiều giữa bàn. Nói rằng bạn có bảng về sản phẩm và đơn đặt hàng, nhưng bây giờ Bạn muốn cho phép một đơn hàng có thể chứa nhiều sản phẩm (mà cấu trúc trên không cho phép). Bạn có thể sử dụng cái này Cấu trúc bảng:

Tạo sản phẩm bảng (
    sản phẩm_no khóa chính số nguyên,
    tên văn bản,
    Giá số
);

Tạo đơn đặt hàng bảng (
    Order_id Số nguyên chính, khóa chính,
    Text_address văn bản,
    ...
);

Tạo bảng thứ tự_items (
    sản phẩm_no kèo bóng đá pháp sản phẩm tham chiếu số nguyên,
    Order_id Integer TÀI LIỆU THAM KHẢO ĐẶT HÀNG,
    số lượng số lượng,
    Khóa chính (sản phẩm_no, order_id)
);

Lưu ý rằng khóa chính chồng chéo với kèo bóng đá pháp khóa nước ngoài trong bảng cuối cùng.

Chúng tôi biết rằng các khóa nước ngoài không cho phép tạo ra các đơn đặt hàng không liên quan đến bất kỳ sản phẩm. Nhưng điều gì sẽ xảy ra nếu kèo bóng đá pháp sản phẩm là Đã xóa sau khi kèo bóng đá pháp đơn đặt hàng được tạo ra tham chiếu nó? SQL cho phép bạn xử lý điều đó là tốt. Theo trực giác, chúng ta có kèo bóng đá pháp vài tùy chọn:

  • kèo bóng đá pháp cho phép xóa sản phẩm được tham chiếu

  • Xóa kèo bóng đá pháp đơn đặt hàng

  • cái gì khác?

Để minh họa điều này, hãy thực hiện chính sách sau Ví dụ về mối quan hệ nhiều-nhiều ở trên: Khi ai đó muốn để xóa kèo bóng đá pháp sản phẩm vẫn được tham chiếu theo đơn đặt hàng (quaorder_items), chúng tôi không cho phép nó. Nếu như ai đó xóa kèo bóng đá pháp đơn đặt hàng, các mục đặt hàng bị xóa dưới dạng Tốt:

Tạo sản phẩm bảng (
    sản phẩm_no khóa chính số nguyên,
    tên văn bản,
    Giá số
);

Tạo đơn đặt hàng bảng (
    Order_id Số nguyên chính, khóa chính,
    Text_address văn bản,
    ...
);

Tạo bảng thứ tự_items (
    Sản phẩm_NO Tài liệu tham khảo Sản phẩmKhi xóa hạn chế,
    Order_id Integer TÀI LIỆU THAM KHẢO Đơn đặt hàngKhi xóa Cascade,,
    số lượng số lượng,
    Khóa chính (sản phẩm_no, order_id)
);

Hạn chế và CASCADING Xóa là hai loại phổ biến nhất tùy chọn.Hạn chếNgăn chặn xóa kèo bóng đá pháp hàng được tham chiếu.kèo bóng đá pháp hành độngcó nghĩa là Nếu bất kỳ hàng tham chiếu nào vẫn tồn tại khi kèo bóng đá pháp là đã kiểm tra, một lỗi được nêu ra; Đây là hành vi mặc định nếu Bạn không chỉ định bất cứ điều gì. (Sự khác biệt thiết yếu giữa Hai lựa chọn này làkèo bóng đá pháp hành độngCho phép kiểm tra được hoãn lại cho đến sau này trong giao dịch, trong khiHạn chếkèo bóng đá pháp.)CascadeChỉ định rằng khi hàng được tham chiếu là đã xóa, hàng tham chiếu nó phải được tự động xóa cũng vậy. Có hai tùy chọn khác:Đặt VÔ GIÁ TRỊĐặt mặc định. Những nguyên nhân này các cột tham chiếu được đặt thành null hoặc giá trị mặc định, tương ứng, khi hàng tham chiếu bị xóa. Lưu ý rằng Những điều này không bào chữa cho bạn khỏi việc quan sát bất kỳ kèo bóng đá pháp. Vì Ví dụ, nếu một hành động chỉ địnhĐặt MẶC ĐỊNHNhưng giá trị mặc định sẽ kèo bóng đá pháp thỏa mãn Khóa nước ngoài, hoạt động sẽ thất bại.

Tương tự nhưtrên xóaCó Mà còntrên bản cập nhậtđược gọi khi A Cột được tham chiếu được thay đổi (cập nhật). kèo bóng đá pháp hành động có thể giống nhau.

Thông tin thêm về việc cập nhật và xóa dữ liệu ởChương 6.

Cuối cùng, chúng ta nên đề cập rằng khóa nước ngoài phải tham khảo các cột là khóa chính hoặc tạo thành một kèo bóng đá pháp. Nếu khóa nước ngoài tham khảo một kèo bóng đá pháp duy nhất, Có một số khả năng bổ sung liên quan đến cách NULL Giá trị được khớp. Những điều này được giải thích trong tài liệu tham khảo Tài liệu choTạo bảng.