![「日志记录」毕设开发之数据库外键问题插图 「日志记录」毕设开发之数据库外键问题插图](https://blog.eswlnk.com/wp-content/uploads/wpcy/70e43c452828fff7d9643daf4c1742e5.jpg)
问题详情
ALTER TABLE `seat` ADD FOREIGN KEY (`lab_id`) REFERENCES `lab` (`lab_id`);
环境:Mysql 5.7
代码没有任何问题,在执行查询后,通过「Navicat Premium」可视化查询后该代码并不能为相对应的字段添加外键,而是增加了索引。
经过检查,表字段以及相对应的表都没有任何问题。
解决办法
通过以下命令查询目标表的状态信息:
SHOW TABLE STATUS LIKE 'test';
![「日志记录」毕设开发之数据库外键问题插图1 「日志记录」毕设开发之数据库外键问题插图1](https://static.eswlnk.com/2024/02/20240212164543155-1024x470.png-esw)
通过询问AI后得到以下答案:
如果你想要在 MySQL 中使用外键约束,表的存储引擎必须是 InnoDB。InnoDB 是 MySQL 中支持事务和外键约束的存储引擎,而 MyISAM 不支持外键约束。
因此,在添加外键约束之前,你需要确保你的表使用的是 InnoDB 存储引擎。如果表使用的是其他存储引擎,如 MyISAM,那么你需要先将表的存储引擎更改为 InnoDB,然后再添加外键约束。
来自《AI》
解决办法一(推荐)
在SQL脚本中,在创建外键的代码之前插入以下:
ALTER TABLE `lab` ENGINE=InnoDB;
修改表的引擎为InnoDB,即可完美解决问题!
解决办法二
数据库默认表引擎存储在mysql.ini
文件中。 打开这个文件,对default-storage-engine
参数进行修改,改为InnoDB
。
default-storage-engine=InnoDB
解决办法三
注意,这个方法会影响当前数据库服务中所有的ISAM引擎的表,所以坚决不推荐,但是知道有这么个东西而已
- 查询所有的表引擎
SHOW PLUGINS;
- 删掉不需要的表引擎
UNINSTALL PLUGIN myisam;
MyISAM 表引擎与InnoDB 表引擎区别
MyISAM 表引擎
- 非事务性引擎:MyISAM 不支持事务,这意味着它不支持 ACID(原子性、一致性、隔离性、持久性)属性,因此不适合要求数据完整性和事务控制的应用。
- 表级锁定:MyISAM 使用表级锁定,这意味着在对表进行读写操作时,其他会话可能无法同时访问相同的表,这会导致并发性能问题。
- 速度快:在某些读密集型应用中,MyISAM 可能比 InnoDB 更快,因为它不需要支持事务和回滚操作,但在写入频繁的情况下,性能可能下降。
- 支持全文索引:MyISAM 支持全文索引,适合全文搜索等应用。
- 表碎片问题:MyISAM 表在删除或更新数据后会产生碎片,需要定期进行优化或维护操作。
InnoDB 表引擎
- 事务性引擎:InnoDB 是事务性表引擎,支持 ACID 特性,适用于需要数据完整性和事务控制的应用,如银行、电子商务等。
- 行级锁定:InnoDB 使用行级锁定,允许多个会话同时访问同一表的不同行,提高了并发性能。
- 支持外键:InnoDB 支持外键约束,可以确保数据的一致性和完整性。
- 崩溃恢复:InnoDB 提供崩溃恢复功能,可以在数据库崩溃后自动修复损坏的数据。
- 自动扩展:InnoDB 表支持自动扩展,可以更灵活地管理磁盘空间。
- 更好的并发性能:对于高并发写入和读取操作的应用,InnoDB 通常具有更好的性能。
📮评论