MySQL执行脚本报错[1100]:表'afiliados'未通过LOCK TABLES锁定
解决MySQL错误1100:Table 'afiliados' was not locked with LOCK TABLES
问题根源
你遇到的问题出在脚本的执行上下文:这段代码是更大脚本的一部分,当前会话可能已经存在未释放的表锁定。MySQL的LOCK TABLES是会话级别的——一旦执行LOCK TABLES锁定了某些表,当前会话只能访问这些被锁定的表;后续创建新表后,新表不会自动加入锁定列表,哪怕你后续写了LOCK TABLES afiliados WRITE,如果之前的锁定未正确处理,依然会触发错误。
另外,你的表采用InnoDB引擎,LOCK TABLES、ALTER TABLE DISABLE/ENABLE KEYS这些语句是为MyISAM设计的,InnoDB会自动处理索引维护,这些语句对它来说完全没必要。
解决方案
方案1:移除不必要的锁表语句(推荐)
直接删除所有和锁表、禁用/启用索引相关的代码,简化后的脚本如下:
DROP TABLE IF EXISTS `afiliados`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `afiliados` ( `value1` varchar(13) NOT NULL, `value2` varchar(30) NOT NULL, `value3` int(11) NOT NULL, `value4` varchar(50) NOT NULL, `value5` varchar(50) NOT NULL, `value6` varchar(100) NOT NULL, `value7` varchar(25) NOT NULL, PRIMARY KEY (`value1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- 直接插入数据,无需锁表 INSERT INTO `afiliados` VALUES ...
InnoDB的事务和行锁机制会自动保证数据一致性,完全不需要手动锁表。
方案2:清理会话残留锁定(若必须保留锁表逻辑)
如果你的更大脚本确实需要锁表,在执行这段创建表的代码前,先释放所有现有锁定:
-- 先清除会话中所有未释放的锁定 UNLOCK TABLES; DROP TABLE IF EXISTS `afiliados`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `afiliados` ( `value1` varchar(13) NOT NULL, `value2` varchar(30) NOT NULL, `value3` int(11) NOT NULL, `value4` varchar(50) NOT NULL, `value5` varchar(50) NOT NULL, `value6` varchar(100) NOT NULL, `value7` varchar(25) NOT NULL, PRIMARY KEY (`value1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; LOCK TABLES `afiliados` WRITE; /*!40000 ALTER TABLE `afiliados` DISABLE KEYS */; INSERT INTO `afiliados` VALUES ... /*!40000 ALTER TABLE `afiliados` ENABLE KEYS */; UNLOCK TABLES;
方案3:批量锁定所有需要操作的表(若更大脚本涉及多表操作)
如果更大的脚本需要同时锁定其他表和afiliados,必须在同一条LOCK TABLES语句中列出所有表,不能分开执行:
-- 同时锁定所有需要操作的表,比如other_table和afiliados LOCK TABLES `other_table` WRITE, `afiliados` WRITE; -- 执行创建表、插入数据等操作 DROP TABLE IF EXISTS `afiliados`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `afiliados` ( `value1` varchar(13) NOT NULL, `value2` varchar(30) NOT NULL, `value3` int(11) NOT NULL, `value4` varchar(50) NOT NULL, `value5` varchar(50) NOT NULL, `value6` varchar(100) NOT NULL, `value7` varchar(25) NOT NULL, PRIMARY KEY (`value1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `afiliados` DISABLE KEYS */; INSERT INTO `afiliados` VALUES ... /*!40000 ALTER TABLE `afiliados` ENABLE KEYS */; UNLOCK TABLES;
内容的提问来源于stack exchange,提问作者Pablo Benavides Canales
相关产品推荐
相关产品推荐

