SQL代码语法错误排查及animal_adoption_history关联实体设计疑问
SQL语法错误排查与关联实体设计修复
一、语法错误修复
1. 外键约束语法错误
在animal_adoption_history表的外键定义中,存在两处问题:
- 外键列名写错:
FOREIGN KEY (animal)应为FOREIGN KEY (animal_id) - 第一条外键约束末尾缺少分号,导致后续语法解析失败
修正后的外键代码:
constraint animal_adoption_history_FK1 FOREIGN KEY (animal_id) references animal(animal_id), constraint animal_adoption_history_FK2 FOREIGN KEY (customer_id) references customer(customer_id)
2. INT类型参数错误
SQL标准中INT类型不需要指定长度(如INT(10)),部分数据库(如PostgreSQL)不支持该写法。将animal表中的a_animal_cost INT(10)改为:
a_animal_cost INT
3. 无效日期格式
插入animal表的两条数据日期不符合YYYY-MM-DD标准:
'11-14'需补充年份,改为'2021-11-14''2018-19-04'月份非法,改为'2018-04-19'
4. 字符长度不匹配
customer表中c_has_adopted_before定义为CHAR(1),但插入值是'Yes'/'No'(长度超过1),需统一改为'Y'/'N',修正插入语句对应字段值。
二、关联实体设计修正
animal_adoption_history作为连接customer和animal的关联表,当前设计不符合关联实体规范,问题及修复方案如下:
- 主键逻辑不合理:原复合主键
(animal_id, customer_id)限制了同一客户不能重复领养同一动物,不符合实际业务场景。建议添加自增主键adoption_id,或把adoption_date加入复合主键,唯一标识每一次领养记录。 - 冗余字段冗余:
has_been_adopted_previously可通过查询历史记录推导,无需存储;is_available_to_adopt是动物当前状态,应归属到animal表。 - 外键完整性优化:可添加
ON DELETE CASCADE等规则,处理关联数据删除的业务逻辑。
修正后的关联表示例:
create table animal_adoption_history ( adoption_id SERIAL PRIMARY KEY, health_conditions VARCHAR(100), reason_for_entry VARCHAR(75), date_entered DATE NOT NULL, adoption_date DATE, return_date DATE, animal_id CHAR(9) NOT NULL, customer_id CHAR(9) NOT NULL, constraint animal_adoption_history_FK1 FOREIGN KEY (animal_id) references animal(animal_id) ON DELETE CASCADE, constraint animal_adoption_history_FK2 FOREIGN KEY (customer_id) references customer(customer_id) ON DELETE CASCADE );
内容的提问来源于stack exchange,提问作者Sarah Denison
相关产品推荐
相关产品推荐

