sql >> Database teknologi >  >> RDS >> Oracle

Brug af en sagserklæring i en kontrolbegrænsning

Jeg tror, ​​du kan gøre følgende:

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 venligst SQL Fiddle-skemaet her.

Du behøver ikke UPPER() begrænsning på salary_grade da regex-kontrollen vil være tilstrækkelig (du tjekker allerede for at sikre, at det er et stort bogstav mellem A og G). Jeg tror ikke, at begrænsningen på salary_scale alene er nødvendigt, da det logisk set ville være indeholdt i den sidste begrænsning.

OPDATERING

Her er hvordan du kan gøre det med en CASE erklæring:

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 venligst SQL Fiddle-skemaet her.



  1. Kan ikke oprette forbindelse til databasen:Adgang nægtet for brugeren ''@'localhost' til databasen 'socialdb'

  2. Er der en automatisk måde at generere et rollback-script, når man indsætter data med LINQ2SQL?

  3. Fjern flere arrays parallelt

  4. Registrering af mysql-understøttelse i php