检查子句中不能使用函数或表达式

Function or expression cannot be used in the check clause

我在 mariadb 10.3.6 中遇到检查约束问题。

例如,table:

create or replace table usuarios (
    cedula int not null,
    contraseña varchar(15) not null,
    nombre varchar(15) not null,
    apellido varchar(15) not null);

并且具有这些功能:

create function contr_usuario(dato varchar(15)) returns int
begin
    return(select dato regexp '^[[:alnum:]]*$');
end;//

create function nom_apell_usuario(dato varchar(25)) returns int
begin
    return (select dato regexp '^[[:alpha:]]*$|(^[[:alpha:]]+[ ]+ 
    [[:alpha:]]*$)');
end;//

我试试这个:

alter table usuarios
add constraint pk_usuarios primary key (cedula);

alter table usuarios
add constraint ck_cedula check (500000 <= cedula and cedula <= 10000000);

alter table usuarios
add constraint ck_contraseña check (contr_usuario(contraseña) = 1);

alter table usuarios
add constraint ck_nom_usuario check (nom_apell_usuario(nombre) = 1);

alter table usuarios
add constraint ck_apell_usuario check (nom_apell_usuario(apellido) = 1);

但它不起作用,我收到以下错误:

ERROR 1901 (HY000) at line 138 in file: '/media/sf_marcelo/projects/control_financiero/sql_scripts/db_finanza.sql': Function or expression '`contr_usuario`()' cannot be used in the CHECK clause of `ck_contraseña`
ERROR 1901 (HY000) at line 140 in file: '/media/sf_marcelo/projects/control_financiero/sql_scripts/db_finanza.sql': Function or expression '`nom_apell_usuario`()' cannot be used in the CHECK clause of `ck_nom_usuario`
ERROR 1901 (HY000) at line 142 in file: '/media/sf_marcelo/projects/control_financiero/sql_scripts/db_finanza.sql': Function or expression '`nom_apell_usuario`()' cannot be used in the CHECK clause of `ck_apell_usuario`
Query OK, 0 rows affected (0.079 sec)

那么,如果不允许使用函数和表达式,我该如何进行检查约束?

Obs:之前我用 mariadb 10.1 尝试过这个,即使相同的代码 运行 在我插入数据时没有问题检查约束不起作用

由于您的函数只包含一个表达式,您可以将该表达式直接拉入检查约束表达式。

alter table usuarios
add constraint ck_contraseña check (contraseña regexp '^[[:alnum:]]*$');

alter table usuarios
add constraint ck_nom_usuario check (nombre regexp '^[[:alpha:]]*$|(^[[:alpha:]]+[ ]+[[:alpha:]]*$)');

alter table usuarios
add constraint ck_apell_usuario check (apellido regexp '^[[:alpha:]]*$|(^[[:alpha:]]+[ ]+[[:alpha:]]*$)');