MySQL存储过程的报错原因和解决方案

语法错误:
直接看错误信息,找到具体的行号。

检查关键字的拼写和句子结构。

参数的数量和类型必须匹配。

运行时错误:
检查数据类型、长度和范围。

添加异常处理语句以捕获错误。

运行时使用日志查看警告消息。

权限错误:
使用 SHOWGRANTSFOR 确认权限。

GRANTEXECUTE授予权限。

REVOKE 收回权限。

一般信息:
启用general_log来记录执行过程。

测试时使用DELIMITER隔离代码块。

模拟边界数据以检查代码的稳健性。

说实话,先找到错误类型,然后一一检查。
如果存在权限问题,直接修改权限即可。

如何在MySQL中创建唯一索引来确保数据唯一性

简单来说,创建唯一索引可以确保数据不会在一列或多列中重复。
这在 MySQL 中很容易做到。

看吧,建表的时候可以直接添加唯一索引。
例如,要创建一个表,请执行以下操作:
sql 创建表用户( ID INT 主键, 用户名 VARCHAR(5 0), 电子邮件 VARCHAR(5 0) 唯一, 电话 varchar(2 0) );
这里,email列中添加了UNIQUE,即唯一索引。
这可确保电子邮件地址不会重复。
如果不想使用默认名称,也可以给它起一个名字:
sql 唯一密钥 idx_phone(电话)
这列出了电话的名为 idx_phone 的唯一索引。

如果已经创建了表,添加唯一索引就很容易。
添加到电子邮件:
sql 更改表添加唯一用户(电子邮件);
或者添加复合索引,使用户名和电话一起唯一:
sql ALTER TABLE USER CONSTRAINT ADD uk_name_phone UNIQUE(用户名, 电话);
请注意,组合索引查看两列的组合值是否唯一,而不是单独的。
例如,可以有多个“张三”和多个1 3 8 001 3 8 000,但不能有“张三”+1 3 8 001 3 8 000的重复组合。

唯一索引也允许多个零值,即零不等于零。
如果不想允许NULL,需要添加NOT NULL:
sql 创建表产品 ( ID INT 主键, 代码 varchar(2 0) 并不完全唯一 );
如果要删除唯一索引,可以通过名称删除:
sql 删除表用户更改索引 uk_name_phone;
或者按列名删除,但只能删除未命名的索引:
sql 更改表用户删除索引电子邮件;
使用唯一索引时,最好以uk_开头命名,例如uk_email。
组合索引时要注意列顺序,这会影响效率。

应用层必须处理1 06 2 错误。
目前尚不清楚其他用户是否提交了重复数据。

唯一索引对写入性能影响较小,同时也占用较多的存储空间。

验证它并尝试插入重复数据:
sql INSERT INTO user(id, username, email) 值 (1 , 'test', 'a@b.com'); INSERT INTO user(id, username, email) VALUES (2 , 'test2 ', 'a@b.com');
是时候报告错误了。
查看索引信息:
sql 显示用户索引;
您可以看到您创建的唯一索引。
这样,数据就完整了,并且最好对用户名、电子邮件地址等使用唯一索引。

MySQL 8.0 新特性之隐藏索引

嗯...MySQL8 .0隐藏索引...挺有趣的。

即...索引设置为隐藏...优化器不需要检查...但是当数据改变时...索引数据也改变...主键不活动...不能设置为隐藏。

设置... 创建表时,可以添加... invisble 和... 或... 创建表后... 使用 ALTER INDEX... 将索引更改为invisble... 或将其更改回来。

如何知道... 使用 INFORMATION_SCHEMA.STATISTICS... 或 SHOW INDEX... 查看 IS_VISIBLE 列。

优化器...有一些...称为 Optimizer_switch...use_invisible_indexes...off 是默认值...忽略隐藏索引...on 是...仍将被考虑...但它不会显示。

使用脚本...一个是...我想删除一个索引...先改成隐藏...看看查询快不快...如果慢...改回快...实在没必要​​删除...省麻烦。

另一个...加入灰度发布...添加一个新索引...先隐藏它...只允许使用部分请求...用Optimizer_switch打开它...看看它是否有效...没问题...然后完全打开它。

另一件事是...检查程序...如果它秘密使用索引...如果它是隐藏的...它会抛出错误...以避免依赖性。

注意...唯一索引...如果用作主键...则无法隐藏...如果添加显式主键...则可以隐藏唯一索引。

监视...使用慢速查询日志...查看是否有任何查询由于索引不可见而变慢...解释...查看执行计划是否更改...PerformanceSchema...查看负载是否更改。

维护...还是占用空间...一旦数据改变...就会改变...所以...如果长时间不用...还是需要删除。

举个例子...比如说...2 02 2 年...我在上海...有一个名为orders的表...里面有索引idx_customer_id...我想尝试删除它...会不会很慢...我会先使用ALTER TABLE...将idx_customer_id更改为INVISIBLE...然后...我会在北京...使用performance_schema...监控...看看orders表的查询是否...又慢了...监控后...i发现...嗯...有点慢...我改回来...更改表...将其改回可见...如果...监视器检测到...没有影响...我可以删除索引...删除它。

灰度发布...例如...我在深圳...我有一个名为product的表...我添加了一个新索引...名为idx_category_id...但我不会先公开...只需使用ALTER INDEX...将idx_category_id设置为INVISIBLE...然后...我在广州...对某些用户使用SET...SESSION...将Optimizer_switch...的use_invisible_indexes...设置为ON...让他们使用这个隐藏索引...让我们使用它...解释...检查...如果没有问题...我将全部打开。

简而言之...隐藏索引...是...逻辑上不使用的索引...仍然是物理上...非常好用...尤其...对于大面板...或者...保证服务...那种环境...可以减少...误操作...很方便。