外键约束FK_Pedido_4索引报错求助:SQL语法问题排查
问题分析与修正方案:FK_Pedido_4的外键错误
核心错误点
你在创建FK_Pedido_4时,试图用Pedido表的三个字段(Codigo_Cozinheiro、Codigo_Atendente、Codigo_Entregador)同时关联Funcionarios表的同一个Registro字段,这不符合SQL外键规则:
- 复合外键要求父表存在对应的复合唯一约束/主键,但
Funcionarios的主键是单个字段Registro,不满足复合外键的关联条件。 - 从业务逻辑看,这三个字段分别对应不同的员工角色(厨师、接待员、配送员),应该各自独立关联员工表的主键,而不是作为一组复合外键关联同一个字段。
修正后的代码
删除原来的FK_Pedido_4语句,替换为三个独立的外键约束:
-- 为厨师字段创建外键 ALTER TABLE Pedido ADD CONSTRAINT FK_Pedido_Cozinheiro FOREIGN KEY (Codigo_Cozinheiro) REFERENCES Funcionarios (Registro) ON DELETE CASCADE; -- 为接待员字段创建外键 ALTER TABLE Pedido ADD CONSTRAINT FK_Pedido_Atendente FOREIGN KEY (Codigo_Atendente) REFERENCES Funcionarios (Registro) ON DELETE CASCADE; -- 为配送员字段创建外键 ALTER TABLE Pedido ADD CONSTRAINT FK_Pedido_Entregador FOREIGN KEY (Codigo_Entregador) REFERENCES Funcionarios (Registro) ON DELETE CASCADE;
额外优化建议
除了外键问题,你的表结构还有一些可以优化的地方:
Cliente表的CPF、Contato字段用REAL类型不合适,浮点型会丢失精度,建议改用VARCHAR(14)(CPF带分隔符)或CHAR(11)(纯数字),电话号码同理用字符串类型。Pizza表的Sabores、Ingredientes字段用CHAR类型长度默认只有1,完全不够存储内容,建议改成VARCHAR(255)。Funcionarios表的Carteira_Trabalho、CNH字段同样不适合用REAL,改用字符串类型更合理。
内容的提问来源于stack exchange,提问作者Marcos Felicio
相关产品推荐
相关产品推荐

