给约束命名

Give name to a constraint

是否可以在 table 中命名约束? 我面临的问题是,当约束不成功时,我收到一条神秘消息,而不是它失败的约束的明确名称。

我试过类似的东西:

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

我想得到比这更清楚的信息。

通常 SQL 的设计是为了让所有受支持的约束都可以指定一个名称。对于您正在使用的引擎的特定 SQL 方言,请参阅引擎的 SQL Syntax 手册。

扩展欧文的回答:

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
>

SQL 标准将约束名称置于约束 'body' 之前,而 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,
…