给约束命名
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,
…
是否可以在 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,
…