Postgresql 8.1.23 Tài liệu | ||||
---|---|---|---|---|
prev | Backward nhanh | Chương 5. Định nghĩa dữ liệu | Chuyển tiếp nhanh | Tiếp theo |
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, tỷ lệ kèo bóng đá tối nay 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ỉ nên 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 tỷ lệ kèo bóng đá tối nay trên các cột và bảng. Các tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay, 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.
Một tỷ lệ kèo bóng đá tối nay kiểm tra là loại tỷ lệ kèo bóng đá tối nay chung nhất. Nó cho phép bạn chỉ định rằng giá trị trong một cột nhất định phải thỏa mãn biểu hiện boolean (giá trị sự thật). Ví dụ, đến Yêu cầu giá sản phẩm tích cực, bạn có thể sử dụng:
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));
Như bạn thấy, định nghĩa tỷ lệ kèo bóng đá tối nay xuất hiện sau dữ liệu Loại, giống như định nghĩa giá trị mặc định. Giá trị mặc định và Các tỷ lệ kèo bóng đá tối nay có thể được liệt kê trong bất kỳ đơn đặt hàng. Một tỷ lệ kèo bóng đá tối nay kiểm tra bao gồm từ khóaKiểm tratheo sau là một biểu thức trong ngoặc đơn. Các tỷ lệ kèo bóng đá tối nay 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ì tỷ lệ kèo bóng đá tối nay sẽ không làm quá nhiều giác quan.
Bạn cũng có thể đặt cho tỷ lệ kèo bóng đá tối nay một tên riêng. Cái này làm rõ thông báo lỗi và cho phép bạn tham khảo tỷ lệ kèo bóng đá tối nay khi bạn cần thay đổi nó. Cú pháp là:
Tạo sản phẩm bảng ( sản phẩm_no số nguyên, tên văn bản, Giá sốtỷ lệ kèo bóng đá tối nay tích cực_priceKiểm tra (Giá 0) );
Vì vậy, để chỉ định một tỷ lệ kèo bóng đá tối nay được đặt tên, hãy sử dụng từ khóatỷ lệ kèo bóng đá tối naytheo sau là một định danh theo sau là định nghĩa tỷ lệ kèo bóng đá tối nay. (Nếu bạn không chỉ định một tên tỷ lệ kèo bóng đá tối nay theo cách này, hệ thống chọn tên cho Bạn.)
Một tỷ lệ kèo bóng đá tối nay 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));
Hai tỷ lệ kèo bóng đá tối nay đầu tiên sẽ trông quen thuộc. Thứ ba người ta sử dụng một cú pháp mới. Nó không được gắn vào một cụ thể thay vào đó, nó xuất hiện dưới dạng một mục riêng biệt trong Danh sách cột được phân tách bằng dấu phẩy. Định nghĩa cột và những điều này Định nghĩa tỷ lệ kèo bóng đá tối nay có thể được liệt kê theo thứ tự hỗn hợp.
Chúng tôi nói rằng hai tỷ lệ kèo bóng đá tối nay đầu tiên là cột các tỷ lệ kèo bóng đá tối nay, trong khi cái thứ ba là một tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay cột cũng có thể được viết dưới dạng bảng các tỷ lệ kèo bóng đá tối nay, trong khi điều ngược lại không nhất thiết là có thể, vì một tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay hệ thống cơ sở dữ liệu khác.) Ví dụ trên cũng có thể là được viết là
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 tỷ lệ kèo bóng đá tối nay bảng chỉ giống nhau cách đối với các tỷ lệ kèo bóng đá tối nay 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),tỷ lệ kèo bóng đá tối nay hợp lệ_discountKiểm tra (Giá Giảm giá_price) );
Cần lưu ý rằng một tỷ lệ kèo bóng đá tối nay kiểm tra được thỏa mãn nếu Biểu thức kiểm tra đánh giá thành giá trị true hoặc null. Từ Hầu hết các biểu thức sẽ đánh giá đến giá trị null nếu bất kỳ toán hạng nào là null, chúng sẽ không ngăn chặn các giá trị null trong cột. Để đảm bảo rằng một cột không chứa các giá trị null, tỷ lệ kèo bóng đá tối nay không có null được mô tả trong phần tiếp theo có thể là đã sử dụng.
Kiểm tra các tỷ lệ kèo bóng đá tối nay có thể hữu ích để tăng cường Hiệu suất của các bảng phân vùng. Để biết chi tiết, xemPhần 5.9.
Một tỷ lệ kèo bóng đá tối nay 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 Integerkhông null,, Tên văn bảnkhông null,, Giá số );
Một tỷ lệ kèo bóng đá tối nay không có null luôn được viết làm cột tỷ lệ kèo bóng đá tối nay. Một tỷ lệ kèo bóng đá tối nay không có null tương đương về mặt chức năng Tạo tỷ lệ kèo bóng đá tối nay kiểm traKiểm tra (Cột_namekhông phải là null),, Nhưng trongPOSTGRESQLTạo một Rõ ràng không phải là tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay. Chỉ Viết các tỷ lệ kèo bóng đá tối nay lần lượt:
Tạo sản phẩm bảng ( Product_no Integer không phải NULL, Tên văn bản không phải null, Giá số không 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 tỷ lệ kèo bóng đá tối nay được kiểm tra.
Thekhông nulltỷ lệ kèo bóng đá tối nay có một nghịch đảo: Thenulltỷ lệ kèo bóng đá tối nay. 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. Thenulltỷ lệ kèo bóng đá tối nay không được định nghĩa trong tiêu chuẩn SQL 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.) Tuy nhiên, một số người dùng giống như nó bởi vì nó giúp dễ dàng chuyển đổi tỷ lệ kèo bóng đá tối nay trong một tập lệnh tài liệu. 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ènkhôngTừ khóa nơi mong muốn.
Tip:Trong hầu hết tỷ lệ kèo bóng đá tối nay thiết kế cơ sở dữ liệu, phần lớn tỷ lệ kèo bóng đá tối nay cột phải được đánh dấu không phải null.
Các tỷ lệ kèo bóng đá tối nay 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à
Tạo sản phẩm bảng ( Product_No Integerđộc đáo,, tên văn bản, Giá số );
Khi được viết dưới dạng tỷ lệ kèo bóng đá tối nay cột và
Tạo sản phẩm bảng ( sản phẩm_no số nguyên, tên văn bản, Giá số,độc đáo (sản phẩm_no));
Khi được viết dưới dạng tỷ lệ kèo bóng đá tối nay bảng.
Nếu một tỷ lệ kèo bóng đá tối nay 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 ( tỷ lệ kèo bóng đá tối nay số nguyên, b số nguyên, C Số nguyên,độc đáo (a, c));
Điều này chỉ định rằng sự kết hợp của tỷ lệ kèo bóng đá tối nay giá trị trong tỷ lệ kèo bóng đá tối nay cột được chỉ định là duy nhất trên toàn bộ bảng, mặc dù bất kỳ Một trong tỷ lệ kèo bóng đá tối nay cột không cần phải (và thông thường không) độc nhất.
Bạn có thể gán tên của riêng mình cho một tỷ lệ kèo bóng đá tối nay duy nhất, trong Cách thông thường:
Tạo sản phẩm bảng ( Product_No Integertỷ lệ kèo bóng đá tối nay phải_be_differentđộc đáo, tên văn bản, Giá số );
Nói chung, một tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay là bằng nhau. Tuy nhiên, 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 tỷ lệ kèo bóng đá tối nay 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ị tỷ lệ kèo bóng đá tối nay. 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.
Về mặt kỹ thuật, một tỷ lệ kèo bóng đá tối nay khóa chính chỉ đơn giản là một Sự kết hợp của một tỷ lệ kèo bóng đá tối nay độc đáo và một tỷ lệ kèo bóng đá tối nay 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 không 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 tỷ lệ kèo bóng đá tối nay duy nhất:
Tạo ví dụ bảng ( tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay 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 (trong khi nó có thể có nhiều tỷ lệ kèo bóng đá tối nay độc đáo và không null). Cơ sở dữ liệu quan hệ Lý thuyết chỉ ra rằng mỗi bảng phải có một khóa chính. Cái này quy tắc không được thi hành bởiPostgreSQL, nhưng thường là tốt nhất để Theo dõi nó.
Một tỷ lệ kèo bóng đá tối nay khóa nước ngoài chỉ định rằng các giá trị trong a cột (hoặc một nhóm cột) phải khớp với các giá trị xuất hiện Trong một số hàng của một bảng khác. Chúng tôi nói điều này duy trìTính toàn vẹn tham chiếugiữa hai tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay 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ố );
Hãy giả sử bạn có một bảng lưu trữ đơn đặt hàng các sản phẩm. Chúng tôi muốn đảm bảo rằng bảng đơn đặt hàng chỉ chứa Đơn đặt hàng các sản phẩm thực sự tồn tại. Vì vậy, chúng tôi xác định một nước ngoài tỷ lệ kèo bóng đá tối nay chính trong bảng đơn đặt hàng tham chiếu các sản phẩm bàn:
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ờ không thể tạo đơn đặt hàng vớisản phẩm_notỷ lệ kèo bóng đá tối nay 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 khảoBảng và tỷ lệ kèo bóng đá tối nay sản phẩm Bảng làtham chiếuBảng. Tương tự, có tỷ lệ kèo bóng đá tối nay 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 Bảng được tham chiếu được sử dụng làm (tỷ lệ kèo bóng đá tối nay) cột được tham chiếu.
Khóa ngoại cũng có thể tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay. Đây là một ví dụ về cú pháp giả tạo:
Tạo bảng T1 ( tỷ lệ kèo bóng đá tối nay 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ị tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay khóa nước ngoài, theo cách thông thường.
Bảng có thể chứa nhiều hơn một tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay khóa nước ngoài trong bảng cuối cùng.
Chúng tôi biết rằng tỷ lệ kèo bóng đá tối nay khóa nước ngoài không cho phép tạo ra tỷ lệ kèo bóng đá tối nay đơ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 một sản phẩm là Đã xóa sau khi một đơ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ó một vài tùy chọn:
Không cho phép xóa sản phẩm được tham chiếu
Xóa tỷ lệ kèo bóng đá tối nay đơ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 tỷ lệ kèo bóng đá tối nay 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 một đơn đặt hàng, tỷ lệ kèo bóng đá tối nay 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) );
27483_27556Hạn chếNgăn chặn xóa tỷ lệ kèo bóng đá tối nay hàng được tham chiếu.Không 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 tỷ lệ kèo bóng đá tối nay 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àKhông 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ếkhông.)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ỊvàĐặ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ỳ tỷ lệ kèo bóng đá tối nay. Vì Ví dụ, nếu một hành động chỉ địnhĐặt MẶC ĐỊNHNhưng giá trị mặc định sẽ không 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ònKhi cập nhậtđược gọi khi A Cột được tham chiếu được thay đổi (cập nhật). tỷ lệ kèo bóng đá tối nay 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 tỷ lệ kèo bóng đá tối nay. Nếu khóa nước ngoài tham khảo một tỷ lệ kèo bóng đá tối nay 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.