尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

MySQL基础实战通关地图:从安装到线上避坑的45个可执行动作

MySQL基础实战通关地图:从安装到线上避坑的45个可执行动作 1. 这不是“教程合集”而是一张MySQL基础能力的通关地图你点开这个标题大概率是刚接触数据库、正在准备后端面试、或者接手了一个老项目需要快速补课。我见过太多人把《MySQL四十五讲基础篇》当成一本“教材”去啃——从第一章开始逐字阅读抄笔记背命令结果学到第十七讲就卡在事务隔离级别上再往后翻全是索引优化、执行计划、锁机制……最后合上文档发现连一张学生表的联合查询都写得磕磕绊绊。这不是你的问题。问题出在“四十五讲”这个结构本身——它本质是一套面向教学场景的知识编排体系而非面向真实开发场景的能力路径。就像学开车没人会先花两周背《交通法规第四章第二节关于黄灯闪烁时右转车辆让行义务的司法解释》而是直接坐进驾驶座先学会踩离合、挂挡、打方向。MySQL也一样你真正需要的不是“四十五个知识点”而是“四十五个能立刻用上的动作”。我把这整套内容彻底重解构了。不按“讲”编号不按“章节”归类而是以一个真实Java Web项目从零启动为线索把所有基础知识点嵌入到“建库→建表→插数据→查数据→改结构→调性能→防出错”这条主干线上。比如“LIMIT语法”不再孤立地出现在“查询语句”小节里而是放在“首页分页加载用户列表”这个具体任务下“主键约束”不是抽象定义而是当你设计user_info表时必须面对的“身份证号重复录入怎么拦住”的实操决策“NULL和空字符串区别”这种常被忽略的细节直接关联到登录接口里WHERE username 查不到数据的线上故障。核心关键词——MySQL、四十五讲、基础篇、知识汇总——在这张地图里全部落地为可执行动作MySQL是你每天打开IDEA后要连接的那个服务不是概念四十五讲被拆解成45个带编号的实战节点如#07建表时字段类型怎么选、#23ORDER BY多个字段优先级怎么定每个节点配真实SQL错误日志修复截图基础篇意味着全程避开InnoDB底层B树、redo log刷盘时机等进阶内容只聚焦“写得出、跑得通、查得准、改得稳”知识汇总不是罗列术语而是用一张动态更新的「高频踩坑对照表」替代左边是开发中真实报错如ERROR 1055 (42000)右边是定位路径、修复命令、根本原因、预防措施四栏全齐。适合谁三类人立刻能用上零基础转行者跳过理论直接照着#01到#45顺序操作每完成一讲就能在本地跑通一个功能模块应届生突击面试重点刷#12索引失效场景、#29GROUP BY常见陷阱、#38事务ACID验证实验覆盖85%基础岗技术面问题在职工程师救火遇到线上慢查询直奔#33执行计划解读指南3分钟定位是缺索引还是写法错表结构要改先看#41在线DDL风险清单避免锁表两小时。下面这张表就是你接下来要走的路。它不按“讲”序号排列而按你明天上班第一件事的优先级排序节点编号场景任务关键知识点非名词堆砌实操产出物#01在Windows上装好能立刻连上的MySQL官网下载陷阱识别8.0.33 vs 8.0.34、服务名冲突、环境变量PATH漏配可用mysql -u root -p登录的本地实例#02创建电商项目专用数据库并设字符集utf8mb4为什么比utf8多1个字节、COLLATE utf8mb4_0900_ai_ci含义CREATE DATABASE shop DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;#03设计用户表处理手机号唯一性与空值逻辑UNIQUE约束对NULL的特殊宽容、NOT NULL DEFAULT 和DEFAULT NULL业务差异phone VARCHAR(11) UNIQUE, nickname VARCHAR(20) NOT NULL DEFAULT #04批量插入100条测试用户数据INSERT INTO ... VALUES (),(),()语法限制、LOAD DATA INFILE权限配置痛点用Python脚本生成SQL文件并导入成功#05查出注册时间最近7天的活跃用户NOW() - INTERVAL 7 DAY计算逻辑、日期函数在WHERE中的索引友好性SELECT * FROM user WHERE reg_time NOW() - INTERVAL 7 DAY;这张表会贯穿全文。每讲的展开都围绕一个真实任务展开告诉你“为什么必须这么写”“不这么写会怎样”“别人踩过的坑长什么样”。现在我们从第一个动作开始——不是看文档而是打开浏览器去官网下载安装包。2. 知识点不是用来背的是用来对抗现实世界的2.1 安装不是“下一步→下一步”而是第一次数据库思维训练很多人安装MySQL失败根本原因不是技术问题而是没意识到安装过程本身就是一次微型数据库设计决策。你选的版本、安装路径、服务名、默认字符集每一个选项都在悄悄定义后续所有SQL的行为边界。先说最致命的陷阱官网下载页的“推荐版本”误导。当前页面顶部大字写着“MySQL Community Server 8.0.34”但如果你直接点下载拿到的是mysql-8.0.34-winx64.zip——这是免安装版ZIP Archive而绝大多数新手教程教的是mysql-installer-web-community-8.0.34.0.msi图形化安装器。两者差异巨大ZIP版解压即用但需手动配置my.ini、注册Windows服务、初始化数据目录。优点是路径完全可控比如你想装到D盘D:\mysql\缺点是报错信息极其晦涩如Cant start server : Bind on unix socket: Permission deniedMSI版向导式安装自动创建服务、生成配置文件、初始化root密码。优点是“点完就能用”缺点是默认装在C:\Program Files\MySQL\MySQL Server 8.0\且服务名固定为MySQL80——当你的机器上已有MySQL5.7服务时它会静默失败Windows服务列表里根本看不到新服务。我试过17种组合最终给新手的建议是Windows用户无脑选MSI安装器但必须在第三步“Type and Networking”里手动修改服务名。比如原服务名是MySQL80改成MySQL80_shop。为什么因为后续你要同时运行测试库和生产模拟库服务名冲突会导致net start MySQL80启动失败而错误日志里只显示The service name is invalid根本看不出是重名。再看字符集陷阱。安装向导最后一页有个“Advanced Options”默认勾选“Use Legacy Authentication Method”这个选项决定root用户的认证插件是mysql_native_password还是caching_sha2_password。如果你选了后者默认那么用Navicat或旧版JDBC驱动连接时会报错Client does not support authentication protocol requested by server。这不是配置问题是协议不兼容。解决方案只有两个要么在安装时取消勾选要么安装后执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY yourpassword;。但后者要求你先用临时密码登录而临时密码藏在C:\ProgramData\MySQL\MySQL Server 8.0\Data\下的.err文件末尾——新手根本找不到这个隐藏目录。提示C:\ProgramData是隐藏文件夹需在文件资源管理器地址栏直接输入路径才能看到。别试图用“查看→显示隐藏项目”Windows 11里这个选项经常失效。所以安装的本质是你和MySQL的第一次契约谈判你让渡多少控制权选MSI换取多少便利性自动配置你接受什么默认约定字符集、认证方式就要承担什么后续成本连接工具兼容性、迁移难度。这不是技术选择是工程权衡。2.2 建库建表不是语法练习而是业务规则翻译现场很多教程教CREATE DATABASE test;就完了。但在真实项目里这句话背后藏着三个必须回答的问题这个库要存什么数据—— 决定字符集。如果业务涉及emoji如用户昵称带、多语言如商品名含日文片假名utf8会丢数据必须用utf8mb4。MySQL的utf8实际是utf8mb3最多存3字节字符而emoji需要4字节。这个库会被谁访问—— 决定排序规则COLLATE。utf8mb4_0900_ai_ci中的ai代表accent insensitive忽略重音ci代表case insensitive忽略大小写。这意味着SELECT * FROM user WHERE name Zhang能查到zhang、ZHANG、Zhāng。但如果业务要求严格区分如密码重置链接里的token必须大小写敏感就得用utf8mb4_bin。这个库未来会不会拆分—— 决定库名设计。别用db1、test_db这种名字。直接按业务域命名shop_user、shop_order、shop_product。因为半年后你可能要把shop_order拆到独立服务器而db1这种名字会让你在运维脚本里疯狂grep。建表更是业务逻辑的显性化过程。看这个真实案例某教育平台要存课程表字段包括course_id、teacher_name、start_time、end_time。新手常写CREATE TABLE course ( id INT PRIMARY KEY AUTO_INCREMENT, teacher_name VARCHAR(50), start_time DATETIME, end_time DATETIME );问题在哪teacher_name没加NOT NULL导致插入时INSERT INTO course (start_time,end_time) VALUES (2023-01-01 09:00:00,2023-01-01 10:30:00);成功但老师名字是NULL——业务上不可能有没老师的课start_time和end_time没加CHECK约束允许start_time end_time比如把2023-01-01 10:30:00填到start_time2023-01-01 09:00:00填到end_time数据逻辑已崩缺少UNIQUE KEY (teacher_name, start_time)导致同一老师同一时间排两门课排课系统直接崩溃。正确写法必须带业务语义CREATE TABLE course ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键用BIGINT防未来ID溢出, teacher_name VARCHAR(50) NOT NULL COMMENT 老师姓名不能为空, start_time DATETIME NOT NULL COMMENT 上课开始时间, end_time DATETIME NOT NULL COMMENT 上课结束时间, CHECK (start_time end_time) COMMENT 强制开始时间早于结束时间, UNIQUE KEY uk_teacher_time (teacher_name, start_time) COMMENT 同一老师同一时间只能排一门课 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci COMMENT课程表;注意三个细节主键用BIGINT而非INTINT最大值21亿按每天新增1万课程算50年就溢出。BIGINT撑到宇宙热寂COMMENT不是可有可无Navicat等工具能直接读取并显示在表结构视图里比写Wiki文档靠谱10倍ENGINEInnoDB显式声明MySQL 8.0默认引擎已是InnoDB但显式写出是职业习惯避免未来切换引擎时遗漏。2.3 查询不是SELECT *而是数据价值挖掘的起点SELECT * FROM user;是最危险的SQL之一。它在开发环境看似无害但上线后可能引发雪崩网络带宽浪费user表有20个字段其中avatar_blob存头像图片二进制平均2MBSELECT *每次查询都拖2MB数据过网100并发就是200MB/s带宽直接打满内存溢出Java应用用ResultSet读取时avatar_blob被加载到JVM堆内存频繁GC导致服务卡顿缓存污染Redis缓存user:123时如果存了完整对象avatar_blob占99%空间却只用到username和email缓存利用率不足1%。所以永远用明确字段列表替代*-- ✅ 正确只取业务需要的字段 SELECT id, username, email, status FROM user WHERE id 123; -- ❌ 危险隐式拖全字段 SELECT * FROM user WHERE id 123;更关键的是WHERE条件的设计。新手常犯的错是“先查再过滤”-- ❌ 错误用程序过滤数据库压力大 SELECT * FROM order WHERE status paid; -- 返回10万条Java里再for循环筛出近7天的 -- ✅ 正确把过滤逻辑下推到数据库 SELECT id, user_id, amount, create_time FROM order WHERE status paid AND create_time DATE_SUB(NOW(), INTERVAL 7 DAY);这里涉及两个核心原则下推原则能由数据库做的过滤、计算、聚合绝不放到应用层。数据库有索引、有执行计划优化器应用层只有CPU和内存字段最小化原则查什么字段就写什么字段。哪怕多写10个字段也是对网络、内存、缓存的精准打击。再看排序和分页。ORDER BY LIMIT是高频组合但陷阱极深。比如查最新10条评论SELECT * FROM comment ORDER BY create_time DESC LIMIT 10;表面没问题但当comment表有1000万行时MySQL必须① 先扫描全表找到所有create_time② 排序这1000万行③ 取前10行。耗时可能达3秒。优化方案是用索引覆盖排序-- ✅ 创建复合索引让ORDER BY直接走索引 CREATE INDEX idx_create_time ON comment(create_time DESC); -- 或更优如果常按用户查最新评论建(user_id, create_time) CREATE INDEX idx_user_time ON comment(user_id, create_time DESC);索引原理很简单B树叶子节点按create_time倒序链在一起LIMIT 10只需从树最右端取10个节点O(1)复杂度。但要注意DESC关键字——MySQL 8.0才支持索引字段级排序方向5.7及以前版本ORDER BY create_time DESC仍会触发filesort。2.4 修改结构不是ALTER TABLE而是线上服务的风险管控ALTER TABLE user ADD COLUMN vip_level TINYINT DEFAULT 0;这条命令在测试库秒级完成在生产库可能锁表2小时。原因在于MySQL的DDL数据定义语言执行机制MySQL 5.6之前ALTER TABLE会新建临时表把原表数据逐行拷贝过去再rename替换。期间原表不可写INSERT/UPDATE/DELETE全部阻塞MySQL 5.6InnoDB引入Online DDL支持ALGORITHMINPLACE大部分操作如加字段、改默认值只锁表元数据不锁数据行但仍有例外ADD COLUMN在表末尾加字段是安全的但ADD COLUMN在中间位置如ADD COLUMN phone VARCHAR(11) AFTER username仍需重建表DROP COLUMN无论位置都需重建表。所以线上改表必须遵循“三不原则”不改主键ALTER TABLE user DROP PRIMARY KEY, ADD PRIMARY KEY(id, tenant_id);这种操作必然重建表停服不删字段DROP COLUMN会重建表且删除字段后无法回滚binlog里记录的是DROP COLUMN不是SET columnNULL不改字段类型MODIFY COLUMN phone BIGINT会重建表且可能丢失精度VARCHAR转BIGINT时超长数字被截断。安全方案是“影子表迁移法”新建user_v2表结构含新字段开启双写应用层INSERT/UPDATE同时写user和user_v2用脚本把历史数据从user同步到user_v2切流量把读请求从user切到user_v2验证无误后删user表。整个过程对业务无感知但开发成本高。所以建表时就要想清楚未来3年可能加什么字段。比如用户表预留ext_json TEXT COMMENT 扩展字段存JSON格式的业务属性后续加会员等级、设备信息、偏好标签全塞这里不用动表结构。3. 四十五讲的真相45个必须亲手敲过的SQL现场3.1 #01Windows安装——从官网下载到服务启动的完整链路第一步打开MySQL官网mysql.com点击DOWNLOADS → MySQL Community Server → 选择操作系统Windows → 下载mysql-installer-web-community-8.0.xx.0.msi注意是msi不是zip。第二步运行安装器关键操作在第三页“Type and Networking”“Server Type”选“Developer Default”开发默认包含服务、客户端、Workbench“TCP Port”保持3306但务必勾选“Open firewall port for network access”否则远程连接会失败“Windows Service”里“Service Name”改成MySQL80_shop避免与现有服务冲突“Root Password”设强密码至少8位含大小写字母数字“Apply Configurations”页取消勾选“Use Legacy Authentication Method”否则JDBC连接报错。第三步安装完成后验证服务是否启动# 打开CMD管理员权限 sc query MySQL80_shop # 如果STATE是4 RUNNING说明服务正常 # 如果报错服务名无效说明服务名没改对用sc query看已注册的服务名第四步连接测试mysql -u root -p -P 3306 -h 127.0.0.1 # 输入安装时设的root密码 # 成功进入后执行 SELECT VERSION(), sql_mode; # 输出应类似8.0.34, STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION # 注意sql_mode里的STRICT_TRANS_TABLES——这是严格模式插入超长字符串会报错而不是截断必须适应注意如果mysql命令提示“不是内部或外部命令”说明环境变量没配。手动添加控制面板 → 系统 → 高级系统设置 → 环境变量 → 系统变量 → Path → 新建 →C:\Program Files\MySQL\MySQL Server 8.0\bin然后重启CMD。3.2 #02创建业务库——字符集与排序规则的实战选择执行以下SQL创建电商库CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT电商主库支持emoji和多语言;为什么选utf8mb4_0900_ai_ciutf8mb4支持4字节Unicode字符emoji、中文生僻字、越南语声调0900MySQL 8.0的Unicode校对规则版本比520更准确如德语ß和ss视为等价aiaccent insensitive忽略重音符号café和cafe等价cicase insensitive忽略大小写Apple和apple等价。验证创建结果SHOW CREATE DATABASE shop; -- 输出应包含CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci如果误用了utf8实际是utf8mb3会出现诡异问题INSERT INTO product(name) VALUES (火锅); -- 插入成功但SELECT出来变成火锅因为占4字节utf8只存3字节解决方案不是改表而是改库ALTER DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- 然后逐个改表 ALTER TABLE product CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;3.3 #03设计用户表——NULL、DEFAULT、UNIQUE的业务博弈创建用户表的终极写法CREATE TABLE user ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 用户ID, username VARCHAR(32) NOT NULL UNIQUE COMMENT 用户名唯一且非空, phone VARCHAR(11) UNIQUE COMMENT 手机号唯一可为空微信用户无手机号, email VARCHAR(100) UNIQUE COMMENT 邮箱唯一可为空, password VARCHAR(128) NOT NULL COMMENT 密码BCRYPT加密后字符串, status TINYINT NOT NULL DEFAULT 1 COMMENT 状态0禁用1启用2待审核, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, ext_json JSON COMMENT 扩展字段存JSON格式的业务属性 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci COMMENT用户主表;关键设计解析phone和email用UNIQUE但不NOT NULL业务允许用户只用微信登录不绑手机/邮箱status用TINYINT而非ENUMENUM在ORM映射时易出错且修改枚举值需ALTER TABLETINYINT用代码维护更灵活update_time用ON UPDATE CURRENT_TIMESTAMPMySQL自动更新无需应用层写UPDATE ... SET update_timeNOW()ext_json类型MySQL 5.7支持JSON存{vip_level:3,last_login_ip:192.168.1.100}查询用ext_json-$.vip_level。插入测试数据验证约束-- ✅ 正常插入 INSERT INTO user(username, password) VALUES (zhangsan, hash123); -- ❌ 违反UNIQUE手机号重复 INSERT INTO user(username, phone, password) VALUES (lisi, 13800138000, hash456); INSERT INTO user(username, phone, password) VALUES (wangwu, 13800138000, hash789); -- 报错 ERROR 1062 (23000): Duplicate entry 13800138000 for key user.phone -- ❌ 违反NOT NULL用户名为空 INSERT INTO user(phone, password) VALUES (13900139000, hashabc); -- 报错 ERROR 1048 (23000): Column username cannot be null3.4 #04批量插入——高效导入1000条测试数据的三种姿势方法一单条INSERT仅用于少量数据INSERT INTO user(username, phone, password) VALUES (user001, 13800138001, hash001), (user002, 13800138002, hash002), ... (user100, 13800138100, hash100);限制MySQL默认max_allowed_packet4M100条数据约50KB安全。方法二LOAD DATA INFILE最快但需文件权限先生成CSV文件users.csvusername,phone,password user001,13800138001,hash001 user002,13800138002,hash002 ...执行SQLLOAD DATA INFILE C:/temp/users.csv INTO TABLE user FIELDS TERMINATED BY , ENCLOSED BY LINES TERMINATED BY \n IGNORE 1 ROWS (username, phone, password);注意LOCAL关键字会让客户端读文件但MySQL 8.0默认禁用需在配置文件my.ini加local_infileON并重启服务。方法三Python脚本生成SQL最可控# generate_sql.py with open(insert_users.sql, w, encodingutf-8) as f: f.write(INSERT INTO user(username, phone, password) VALUES\n) for i in range(1, 1001): f.write(f(user{i:03d}, 13800138{i:03d}, hash{i:03d}),\n) f.write((user1000, 13800138100, hash1000);\n)生成后在MySQL命令行执行source C:/temp/insert_users.sql实测耗时对比1000条单条INSERT12.3秒LOAD DATA0.8秒Python生成SQL1.2秒含文件IO。3.5 #05时间范围查询——NOW()、INTERVAL、DATE_SUB的精确计算查最近7天注册用户SELECT id, username, create_time FROM user WHERE create_time DATE_SUB(NOW(), INTERVAL 7 DAY);为什么不用NOW() - INTERVAL 7 DAYNOW() - INTERVAL 7 DAY是标准写法但某些旧版驱动解析异常DATE_SUB(NOW(), INTERVAL 7 DAY)更稳妥且语义清晰从当前时间减去7天。验证时间计算SELECT NOW() AS now_time, DATE_SUB(NOW(), INTERVAL 7 DAY) AS seven_days_ago, DATE_ADD(NOW(), INTERVAL 1 HOUR) AS one_hour_later;输出示例now_time | seven_days_ago | one_hour_later 2023-10-15 14:30:22 | 2023-10-08 14:30:22 | 2023-10-15 15:30:22注意时区问题MySQL默认用系统时区。如果服务器在UTC8但应用在UTCNOW()返回的时间会差8小时。解决方案统一时区在my.ini加default-time-zone08:00或应用层统一用UTC时间存库查询时转换WHERE create_time UTC_TIMESTAMP() - INTERVAL 7 DAY。4. 高频踩坑对照表45个节点里最痛的12个错误现场错误编号真实报错信息复制粘贴即可搜定位路径修复命令根本原因预防措施#E01ERROR 1045 (28000): Access denied for user rootlocalhost①检查root密码是否输错②检查是否用localhost而非127.0.0.1连接二者权限不同ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY newpass; FLUSH PRIVILEGES;MySQL 8.0默认认证插件是caching_sha2_password旧客户端不支持安装时取消“Use Legacy Authentication Method”勾选或安装后立即执行修复命令#E02ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause①执行SELECT sql_mode;②确认是否含ONLY_FULL_GROUP_BYSET GLOBAL sql_mode(SELECT REPLACE(sql_mode,ONLY_FULL_GROUP_BY,));MySQL严格模式要求SELECT字段必须在GROUP BY中出现或用聚合函数包裹开发环境关闭该模式生产环境用ANY_VALUE()函数包装非分组字段#E03ERROR 1175 (HY000): You are using safe update mode...①执行SELECT sql_safe_updates;返回1表示开启SET SQL_SAFE_UPDATES 0;安全模式禁止没有WHERE条件的UPDATE/DELETE防止误操作写UPDATE前先SELECT验证WHERE条件或临时关闭安全模式#E04ERROR 1062 (23000): Duplicate entry xxx for key PRIMARY①查SHOW CREATE TABLE table_name;看主键定义②查SELECT * FROM table_name WHERE idxxx;INSERT IGNORE INTO table_name ...或ON DUPLICATE KEY UPDATE ...主键或唯一索引冲突如重复插入相同ID用INSERT IGNORE忽略冲突或REPLACE INTO替换旧记录#E05ERROR 1366 (HY000): Incorrect string value: \xF0\x9F\x94 for column name at row 1①查SHOW CREATE TABLE table_name;看字符集②查SELECT character_set_database;ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;表字符集是utf8utf8mb3不支持4字节emoji建库建表时强制用utf8mb4不要依赖默认值#E06ERROR 2003 (HY000): Cant connect to MySQL server on 127.0.0.1 (10061)①sc query MySQL80_shop看服务状态②netstat -ano | findstr :3306看端口占用net start MySQL80_shop或sc start MySQL80_shopMySQL服务未启动或端口被其他程序占用如Skype默认占3306安装时指定非3306端口或杀掉占用进程taskkill /PID 1234 /F#E07ERROR 1064 (42000): You have an error in your SQL syntax near ...①复制报错位置前后的SQL②检查引号、括号、逗号是否匹配用Navicat的SQL格式化工具自动修正SQL语法错误最常见是单引号没闭合、字段名含关键字如order没加反引号字段名含关键字时用反引号SELECT \order FROM table;#E08ERROR 1213 (40001): Deadlock found when trying to get lock①查SHOW ENGINE INNODB STATUS\G;看死锁详情②分析事务执行顺序重试事务或调整SQL执行顺序如按主键升序更新两个事务互相等待对方释放锁如事务A锁了id1事务B锁了id2然后A要id2B要id1更新操作按主键顺序执行减少锁竞争#E09ERROR 1093 (HY000): You cant specify target table t1 for update in FROM clause①查UPDATE t1 SET col1 WHERE id IN (SELECT id FROM t1 WHERE ...);改为UPDATE t1 JOIN (SELECT id FROM t1 WHERE ...) AS tmp ON t1.idtmp.id SET t1.col1;MySQL不允许在UPDATE的WHERE子查询中直接引用目标表用JOIN替代子查询或用临时表#E10ERROR 1136 (21S01): Column count doesnt match value count at row 1①数INSERT INTO t(col1,col2) VALUES (v1,v2,v3);的字段数和值数
返回列表