MySQL Workbench无法创建表(约束错误):Error Code 3813求助
问题分析与解决
错误原因
报错Error Code: 3813 Column check constraint 'lancamento_chk_2' references other column是因为你在status_lanca字段的CHECK约束中错误引用了tipo列。MySQL的列级CHECK约束只能针对当前字段本身,不能引用其他列。
你的原语句中,status_lanca的约束写成了:
status_lanca varchar(20) check(tipo in ('PENDENTE','CANCELADO','EFETIVADO')) NOT NULL
这里把约束的目标字段写错了,应该检查status_lanca的取值,而非tipo。
修正后的建表语句
create table lancamento ( id bigint not null primary key auto_increment, descricao varchar(100) not null, mes integer not null, ano integer not null, valor numeric (16,2) not null, tipo varchar(20) check(tipo in('RECEITA','DESPESA')) not null, status_lanca varchar(20) check(status_lanca in ('PENDENTE','CANCELADO','EFETIVADO')) NOT NULL, id_usuario bigint references usuarios(id), data_cad_lanca date );
额外说明
如果需要跨列的约束逻辑(比如根据tipo的值限制status_lanca的可选值),可以使用表级CHECK约束,写法示例:
create table lancamento ( id bigint not null primary key auto_increment, descricao varchar(100) not null, mes integer not null, ano integer not null, valor numeric (16,2) not null, tipo varchar(20) not null, status_lanca varchar(20) NOT NULL, id_usuario bigint references usuarios(id), data_cad_lanca date, -- 列级约束移到表级统一管理 constraint chk_tipo check(tipo in('RECEITA','DESPESA')), constraint chk_status check(status_lanca in ('PENDENTE','CANCELADO','EFETIVADO')) -- 示例跨列约束:如果是RECEITA,状态不能为CANCELADO -- constraint chk_tipo_status check(not (tipo = 'RECEITA' and status_lanca = 'CANCELADO')) );
内容的提问来源于stack exchange,提问作者leunab g
相关产品推荐
相关产品推荐

