Các ràng buộc trên bảng và cột cho phép bạn thực thi chất lượng dữ liệu. Trong SQL, có hai cách tạo ràng buộc trên bảng: nội tuyến và ngoài dòng .
Trong bài viết này, tôi sẽ khám phá những hạn chế này và những ưu điểm của chúng cũng như giải thích những hạn chế nào mà tôi đề xuất và tại sao.
Ràng buộc Nội tuyến là gì?
Ràng buộc nội dòng là một ràng buộc bạn khai báo trên cùng dòng với cột khi tạo bảng.
TẠO nhân viên BẢNG (emp_id NUMBER (10) KHÓA CHÍNH, first_name VARCHAR2 (200), last_name VARCHAR2 (200), dept_id NUMBER (10));
Trong ví dụ này, các từ KHÓA CHÍNH sau cột emp_id cho biết rằng emp_id là khóa chính.
Do đó, chúng tôi đã tạo ràng buộc khóa chính trên cột này bằng cách thêm các từ khóa. Khái niệm này giống nhau bất kể loại ràng buộc nào.
Ràng buộc ngoài luồng là gì?
Ràng buộc ngoài dòng là ràng buộc được khai báo trên một dòng riêng biệt cho cột. Chúng tôi thêm nó vào cuối câu lệnh CREATE TABLE.
Ví dụ:chúng tôi có tập lệnh sau:
TẠO BẢNG nhân viên (emp_id NUMBER (10), first_name VARCHAR2 (200), last_name VARCHAR2 (200), dept_id NUMBER (10), CONSTRAINT pk_emp PRIMARY KEY (emp_id));
Như bạn có thể thấy, chúng tôi đặt ràng buộc KHÓA CHÍNH, được gọi là pk_emp , vào cột emp_id ở cuối câu lệnh.
Khái niệm này hoạt động theo cùng một cách bất kể loại ràng buộc là gì.
Bây giờ, chúng ta hãy phân tích sự khác biệt giữa hai loại ràng buộc này, khác với nơi chúng được khai báo.
Ràng buộc ngoài dòng có thể có tên được chỉ định
Khi tạo các ràng buộc ngoài dòng, chúng ta có thể chỉ định tên. Mặc dù điều này có vẻ lãng phí thời gian, nhưng nó có thể hữu ích.
Hãy xem xét điều này trên một ví dụ cụ thể:
CREATE TABLE nhân viên (emp_id NUMBER (10), first_name VARCHAR2 (200), last_name VARCHAR2 (200), dept_id NUMBER (10), CONSTRAINT pk_emp PRIMARY KEY (emp_id), CONSTRAINT fk_emp_deptid FOREIGN KEY (dept_id) bộ phận REFERENCES ), CONSTRAINT ck_emp_lnlen CHECK (LENGTH (last_name)> 3));
Chúng tôi đã chỉ định các tên sau cho một số ràng buộc:
- pk_emp
- fk_emp_deptid
- ck_emp_lnlen
Tuy nhiên, có vẻ như đó chỉ là thao tác nhập không cần thiết. Chúng tôi sẽ xem xét kỹ hơn vấn đề này.
Vì vậy, tại sao chúng ta cần gán tên cho một ràng buộc?
Có các ràng buộc được đặt tên có thể hữu ích trong một số trường hợp. Không chỉ định tên, Oracle tự động tạo tên cho ràng buộc mà nó thực hiện cho tất cả các ràng buộc nội tuyến. Thông thường, tên này không cung cấp bất kỳ thông tin hữu ích nào.
Khi bạn gặp lỗi trong câu lệnh SQL, mã PL / SQL hoặc mã ứng dụng, bạn nên sử dụng tên ràng buộc và biết nó đề cập đến cái gì hoặc ít nhất là phỏng đoán. Chẳng hạn như tên pk_emp hoặc ck_emp_lnlen sẽ mang tính mô tả nhiều hơn so với EMP1290894FH chung chung tên.
Ngoài ra, khi xem xét các kế hoạch thực thi, tên ràng buộc thường được sử dụng trong đầu ra, điều này giúp bạn dễ dàng tìm ra cách kế hoạch đang được thực thi. Đặc biệt, khi chúng tôi có các trường hợp xác định xem khóa chính hay khóa ngoại đang được sử dụng.
Ràng buộc NOT NULL Chỉ có thể được khai báo nội tuyến
Chỉ có một loại ràng buộc có thể được khai báo là ràng buộc nội tuyến. Đây là ràng buộc NOT NULL.
Điều này có nghĩa là bạn không thể khai báo nó là không đúng dòng.
Thực thi đoạn mã sau:
TẠO BẢNG nhân viên (emp_id NUMBER (10), first_name VARCHAR2 (200), last_name VARCHAR2 (200) NOT NULL, dept_id NUMBER (10));
Tuy nhiên, khi chạy đoạn mã dưới đây, chúng ta có thể thấy rằng nó không hoạt động:
TẠO BẢNG nhân viên (emp_id NUMBER (10), first_name VARCHAR2 (200), last_name VARCHAR2 (200), dept_id NUMBER (10), CONSTRAINT nn_emp_ln NOT NULL (last_name));
Tóm lại, đối với các ràng buộc NOT NULL, chúng ta phải khai báo chúng nội tuyến.
Ràng buộc KIỂM TRA có thể tham chiếu đến nhiều cột
Nếu bạn tạo ràng buộc nội tuyến CHECK, nó chỉ có thể tham chiếu đến cột mà nó đang được tạo.
Tuy nhiên, nếu bạn tạo ràng buộc KIỂM TRA nằm ngoài dòng, thì ràng buộc đó có thể tham chiếu đến nhiều cột.
Tạo nhân viên bảng với ràng buộc KIỂM TRA như hình dưới đây:
TẠO BẢNG nhân viên (emp_id NUMBER (10), first_name VARCHAR2 (200) KIỂM TRA (LENGTH (first_name)> 10), last_name VARCHAR2 (200), dept_id NUMBER (10));
Ràng buộc này cho thấy rằng first_name phải dài hơn 10 ký tự.
Tuy nhiên, điều gì sẽ xảy ra nếu chúng tôi muốn chỉ định rằng sự kết hợp họ và tên phải vượt quá 10 ký tự?
Để thực hiện việc này, hãy viết lại mã dưới dạng ràng buộc ngoài dòng:
TẠO BẢNG nhân viên (emp_id NUMBER (10), first_name VARCHAR2 (200) ,, last_name VARCHAR2 (200), dept_id NUMBER (10), CONSTRAINT ck_fullname_len CHECK (LENGTH (first_name || last_name)> 10));Chúng ta có thể thấy rằng quy tắc này chỉ có thể được thực hiện với một ràng buộc ngoài dòng.
Phương pháp được đề xuất
Sau khi phân tích cả hai phương pháp:nội tuyến hoặc ngoại tuyến, tôi khuyên bạn nên sử dụng các ràng buộc ngoại tuyến.
Có một vài lý do giải thích cho điều này.
Đầu tiên, bạn có thể chỉ định tên cho các ràng buộc của mình và xem chúng trong thông báo lỗi và kế hoạch thực thi nội bộ. Nó cũng có thể giúp vô hiệu hóa và kích hoạt các ràng buộc.
Thứ hai, các ràng buộc kiểm tra cho phép bạn tham chiếu đến nhiều cột và cột đơn. Do đó, sẽ linh hoạt hơn nếu bạn thêm chúng dưới dạng ràng buộc ngoài luồng.
Cuối cùng, việc có tất cả các ràng buộc được khai báo là ngoài dòng (ngoại trừ NOT NULL chỉ có thể được định nghĩa là một ràng buộc nội tuyến) giúp bạn dễ dàng nhìn vào cú pháp CREATE TABLE của mình và xem tất cả các ràng buộc của bạn ở một nơi. Điều quan trọng đặc biệt là trong trường hợp có các bảng lớn với nhiều ràng buộc.
Tóm lại, bạn có thể tạo các ràng buộc bằng hai phương pháp khác nhau:nội dòng và ngoại dòng. Tôi khuyên bạn nên sử dụng phương pháp out-line nếu bạn có thể, vì có tính linh hoạt hơn và đặt tên cho các ràng buộc, do đó, đơn giản hóa việc phân tích các kế hoạch thực thi và thông tin SQL khác của bạn.