Как использовать CONSTRAINT CHECK в SQLDEVELOPER на определенную дату? - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь установить CONSTRAINT для столбца Nr_AnoLetivo, который представляет собой ДАТУ, которая может быть НЕ НЕДЕЙСТВИТЕЛЬНА И БОЛЬШЕ, чем 2000 год.

Я пытался это:

CREATE TABLE Classe(
  Cd_Classe     NUMBER(8),   
  Nr_AnoLetivo  NUMBER(4) CONSTRAINT CLASSE_NR_ANOLETIVO_NN NOT NULL,
  Cd_Escola     NUMBER(5),
  Cd_Grau       NUMBER(2),
  Nr_Serie      NUMBER(2) CONSTRAINT CLASSE_NR_SERIE_NN NOT NULL, 
  Sg_Turma      VARCHAR2(2) CONSTRAINT CLASSE_SG_TURMA_NN NOT NULL,
  Cd_Periodo    NUMBER(2),
  CONSTRAINT CLASSE_CD_CLASSE_PK PRIMARY KEY (CD_CLASSE),
  CONSTRAINT CLASSE_NR_ANOLETIVO_CK CHECK (NR_ANOLETIVO IN DATE ('2000/01/01')),
  CONSTRAINT ESCOLA_CD_ESCOLA_FK FOREIGN KEY (CD_ESCOLA) REFERENCES Escola (CD_ESCOLA),
  CONSTRAINT GRAU_CD_GRAU_FK FOREIGN KEY (CD_GRAU) REFERENCES Grau (CD_GRAU),
  CONSTRAINT PERIODO_CD_PERIODO_FK FOREIGN KEY (CD_PERIODO) REFERENCES Periodo (CD_PERIODO)
);

И сообщение об ошибке:

  1. 00000 - «пропущенное выражение»

Что-то подсказывает мне, что эта ошибка генерируется строкой DATE, и я не понимаю, почему.

Может кто-нибудь сказать, почему это происходит?

1 Ответ

0 голосов
/ 16 сентября 2018

Вы ошиблись.

Если вы объявили столбец NR_ANOLETIVO как NUMBER(4), похоже, вы ожидаете год только в этом столбце (например, 1957, 1998, 2010).и т. д.), а не всю дату (например, 16.09.2018 (дд.мм.гггг)).

Следовательно, установка ограничения для проверки некоторого значения date неверна - выследует проверить, что значение, которое вы поместили в этот столбец, больше 2000. Примерно так (ваш код упрощен):

SQL> create table classe
  2    (cd_classe    number(8) constraint pk_cla primary key,
  3     --
  4     nr_anoletivo number(4) constraint ch_nra_2k check (nr_anoletivo > 2000)
  5                            not null,
  6     --
  7     cd_grau      number(2));

Table created.

SQL> insert into classe (cd_classe, nr_anoletivo, cd_grau) values (1, 1990, 23);
insert into classe (cd_classe, nr_anoletivo, cd_grau) values (1, 1990, 23)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CH_NRA_2K) violated


SQL> insert into classe (cd_classe, nr_anoletivo, cd_grau) values (2, 2018, 33);

1 row created.

SQL>

Если вы действительно хотели проверить полную дату, то вам следует изменить столбец типа данных (DATE), а также ограничение:

SQL> create table classe
  2    (cd_classe    number(8) constraint pk_cla primary key,
  3     --
  4     nr_anoletivo date      constraint ch_nra_2k check (nr_anoletivo > date '2000-01-01')
  5                            not null,
  6     --
  7     cd_grau      number(2));

Table created.

SQL> insert into classe (cd_classe, nr_anoletivo, cd_grau) values (1, date '1990-12-25', 23);
insert into classe (cd_classe, nr_anoletivo, cd_grau) values (1, date '1990-12-25', 23)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CH_NRA_2K) violated


SQL> insert into classe (cd_classe, nr_anoletivo, cd_grau) values (2, date '2018-09-16', 33);

1 row created.

SQL>
...