You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:31:16