我在mariadb 10.3.6中遇到检查约束问题。
例如,使用此表:
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尝试了这个,即使我插入数据时相同的代码运行没有问题,但是检查约束没有工作