sql >> Databasteknik >  >> RDS >> Oracle

Använda en fallbeskrivning i en kontrollbegränsning

Jag tror att du kan göra följande:

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' )
);

Se SQL Fiddle-schema här.

Du behöver inte UPPER() begränsning på salary_grade eftersom regexkontrollen kommer att räcka (du kontrollerar redan att det är en stor bokstav mellan A och G). Jag tror inte att begränsningen på salary_scale enbart är nödvändigt antingen eftersom det logiskt sett skulle finnas i den sista begränsningen.

UPPDATERA

Så här kan du göra det med en CASE uttalande:

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 )
);

Se SQL Fiddle-schema här.



  1. Hur djupkopierar jag en uppsättning data och ändrar FK-referenser till att peka på alla kopior?

  2. MySQLi förberedde uttalanden som visar fel på grund av att MySQLnd inte har installerats

  3. Få kommande födelsedagar Mysql och PHP

  4. Flera främmande nycklar?