为约束命名

时间:2018-04-23 16:56:36

标签: constraints informix

是否可以在表格中命名约束? 我面临的问题是,当一个约束没有成功时,我得到一个神秘的消息,而不是一个明确的名称,它失败了哪个约束。

我尝试过类似的事情:

primer_nombre   varchar(25) NOT NULL CHECK 'is_it_valid?' (primer_nombre MATCHES '^[a-zA-Z]$' )

但这失败了。所以我卡在这里。

CREATE TABLE Usuarios
 (
  CI  INT PRIMARY KEY,
  primer_nombre   varchar(25) NOT NULL CHECK (primer_nombre MATCHES '^[a-zA-Z]$' ),
  segundo_nombre   varchar(25),
  primer_apellido   varchar(25) NOT NULL,
  segundo_apellido   varchar(25),
  grado INT CHECK ( grado > 0 AND grado < 8),
  fecha_nacimiento DATE NOT NULL,
  nota INT CHECK ( nota > 0 AND nota < 13),
  email varchar(80),
  hace_proyecto boolean,
  tipo varchar(20) CHECK (tipo IN ('Admin', 'Docente', 'Alumno')),
  encriptacion_hash varchar(250),
  encriptacion_sal varchar(250),
  baja boolean 
 );

输出我得到:

 530: Check constraint (admin_proyecto.c106_43) failed.
Error in line 7
Near character position 127

我想得到一个比这更明确的信息。

3 个答案:

答案 0 :(得分:2)

扩展Erwin的答案:

CREATE TABLE Usuarios
 (
  CI  INT PRIMARY KEY,
  primer_nombre   varchar(25) NOT NULL CHECK (primer_nombre MATCHES '^[a-zA-Z]$' ) CONSTRAINT constraint_primer_nombre 
 ); 
> insert into Usuarios values (1,'asd');

  530: Check constraint (Administrator.constraint_primer_nombre) failed.
Error in line 1
Near character position 36
>

答案 1 :(得分:2)

SQL标准在约束&#39; body&#39;之前定位约束名称,而Informix将约束名称定位在约束主体之后。

因此,在标准SQL中,您可以编写:

…
grado INT  CONSTRAINT usuarios_grado CHECK (grado > 0 AND grado < 8),
…

但是在Informix的方言中,你需要写:

…
grado INT  CHECK (grado > 0 AND grado < 8) CONSTRAINT usuarios_grado,
…

答案 2 :(得分:1)

通常,SQL设计为可以为所有支持的约束分配名称。对于您正在使用的引擎的特定SQL方言,请参阅引擎的SQL Syntax手册。