「日志记录」毕设开发之数据库外键问题插图

问题详情

ALTER TABLE `seat` ADD FOREIGN KEY (`lab_id`) REFERENCES `lab` (`lab_id`);

环境:Mysql 5.7

代码没有任何问题,在执行查询后,通过「Navicat Premium」可视化查询后该代码并不能为相对应的字段添加外键,而是增加了索引。

经过检查,表字段以及相对应的表都没有任何问题。

解决办法

通过以下命令查询目标表的状态信息:

SHOW TABLE STATUS LIKE 'test';
「日志记录」毕设开发之数据库外键问题插图1

通过询问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引擎的表,所以坚决不推荐,但是知道有这么个东西而已

  1. 查询所有的表引擎SHOW PLUGINS;
  2. 删掉不需要的表引擎UNINSTALL PLUGIN myisam;

MyISAM 表引擎与InnoDB 表引擎区别

MyISAM 表引擎

  1. 非事务性引擎:MyISAM 不支持事务,这意味着它不支持 ACID(原子性、一致性、隔离性、持久性)属性,因此不适合要求数据完整性和事务控制的应用。
  2. 表级锁定:MyISAM 使用表级锁定,这意味着在对表进行读写操作时,其他会话可能无法同时访问相同的表,这会导致并发性能问题。
  3. 速度快:在某些读密集型应用中,MyISAM 可能比 InnoDB 更快,因为它不需要支持事务和回滚操作,但在写入频繁的情况下,性能可能下降。
  4. 支持全文索引:MyISAM 支持全文索引,适合全文搜索等应用。
  5. 表碎片问题:MyISAM 表在删除或更新数据后会产生碎片,需要定期进行优化或维护操作。

InnoDB 表引擎

  1. 事务性引擎:InnoDB 是事务性表引擎,支持 ACID 特性,适用于需要数据完整性和事务控制的应用,如银行、电子商务等。
  2. 行级锁定:InnoDB 使用行级锁定,允许多个会话同时访问同一表的不同行,提高了并发性能。
  3. 支持外键:InnoDB 支持外键约束,可以确保数据的一致性和完整性。
  4. 崩溃恢复:InnoDB 提供崩溃恢复功能,可以在数据库崩溃后自动修复损坏的数据。
  5. 自动扩展:InnoDB 表支持自动扩展,可以更灵活地管理磁盘空间。
  6. 更好的并发性能:对于高并发写入和读取操作的应用,InnoDB 通常具有更好的性能。