oracle - 如何在特定日期在 SQLDEVELOPER 中使用 CONSTRAINT CHECK?
问题描述
我正在尝试在Nr_AnoLetivo
DATE 列上设置一个 CONSTRAINT,它只能是 NOT NULL 并且大于 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)
);
错误消息是:
- 00000 - “缺少表达式”
有些东西告诉我这个错误是由 DATE 行产生的,我不明白为什么。
谁能告诉为什么会这样?
解决方案
你理解错了。
如果您将NR_ANOLETIVO
列声明为,则您似乎只NUMBER(4)
希望该列中的年份(例如 1957、1998、2010 等),而不是整个日期(例如 16.09.2018 (dd.mm.yyyy))。
因此,设置一个约束来检查某个日期值是错误的——你应该检查你放入该列的值是否大于 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>
如果您真的想检查完整日期,那么您应该修改数据类型列 (to 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>
推荐阅读
- c# - 如何更改支持 UIViewController 和 UIView 的方法的签名?
- javascript - Express.js:如何在我的模块中导出承诺的异步结果
- database-design - 弱实体是否总是需要部分密钥?
- python - 需要有关引用计数的指导
- python-3.x - Tensorflow MirroredStrategy() 看起来只能在一个 GPU 上运行?
- javascript - 在特定时区的 Cloud Functions 中获取新日期
- ruby-on-rails - 如何查询 Rails 中的关联与 ActiveRecord 的关联?
- python - 使用正态分布填充 Pandas 数据框
- python - 如何在烧瓶(python)上进行firebase查询?
- bash - 通过标准输入将带有参数的脚本作为字符串传递给 bash