Tôi nghĩ bạn có thể làm như sau:
CREATE TABLE Grade
(
salary_grade char(1) NOT NULL CHECK (REGEXP_LIKE(salary_grade, '[A-G]', 'c')),
salary_scale char(2) DEFAULT 'S1' NOT NULL,
CONSTRAINT pk_grade PRIMARY KEY (salary_grade),
CONSTRAINT ck_grade_scale CHECK ( REGEXP_LIKE(salary_grade, '[A-D]', 'c') AND salary_scale = 'S1'
OR REGEXP_LIKE(salary_grade, '[E-G]', 'c') AND salary_scale = 'S2' )
);
Vui lòng xem lược đồ SQL Fiddle tại đây.
Bạn không cần UPPER()
ràng buộc về salary_grade
vì kiểm tra regex sẽ đủ (bạn đã kiểm tra để đảm bảo rằng đó là một chữ cái viết hoa giữa A và G). Tôi không nghĩ rằng có sự ràng buộc đối với salary_scale
một mình là cần thiết vì nó sẽ được chứa, về mặt logic, trong ràng buộc cuối cùng.
CẬP NHẬT
Đây là cách bạn có thể làm điều đó với CASE
tuyên bố:
CREATE TABLE Grade
(
salary_grade char(1) NOT NULL CHECK (REGEXP_LIKE(salary_grade, '[A-G]', 'c')),
salary_scale char(2) DEFAULT 'S1' NOT NULL,
CONSTRAINT pk_grade PRIMARY KEY (salary_grade),
CONSTRAINT ck_grade_scale CHECK ( salary_scale = CASE WHEN REGEXP_LIKE(salary_grade, '[A-D]', 'c') THEN 'S1' ELSE 'S2' END )
);
Vui lòng xem lược đồ SQL Fiddle tại đây.