MySQL之存储过程.触发器学习整理

本文分享了在MySQL中进行数据库操作的经验,包括修改列类型、修改列名、添加列、删除列等基本命令,同时介绍了MySQL函数、存储过程、触发器的使用方法,并对比了不同数据库之间的差异。
前几天去参加腾讯的面试,在一面中,面试官问了一个问题:会用数据库吗?我说基本的会,然后他说:现在写一个删除一列的sql语句,然后就尴尬了。。。
     回来后,决定好好把基本的sql语句好好学一下,再把相关的内容再复习一下。
     今天主要看的是MySQL,顺便说一下,不同的数据库之间差距还是蛮大的,比如说SQL Server和MySQL,Oracle和MySQL,言归正传,先说一下,面试官问的那个问题。(以下命令都在Mysql5.5中测试通过)
     Mysql修改列类型语句如下:
     alter table 表名 change 列名 列名 要修改的列类型;
     Mysql修改列名语句如下:
     alter table 表名 change 列名 要修改的列名 原来的类型;
     Mysql添加一列:
     alter table 表名 add column 要加的列名 要加的列名类型;
     MYsql删除一列:
     alter table 表名 drop column 要删除的列名;
     再来说一下,Mysql函数,存储过程,触发器的那些事。
     创建一个mysql函数命令如下:
     create function 函数名(参数名 参数类型)returns 返回类型
          begin
               statement;
          end;
     示例如下:
     create function gets(s int)returns int
          begin
               declare a int;     //mysql中声明变量不需要@!!!跟其他数据库不太一样!!切记!!!
               set @a=3;       //每句之后需加一个;不然报错!!!
               return @a+s;   //要有返回语句!!!
          end;
     下面就可以直接调用了:gets(3);
     再说存储过程,创建存储过程命令如下:
     create procedure 存储过程名(参数名 参数类型)returns 返回类型
          begin
               statement;
          end;
     存储过程和函数里面内容差不多,不过在调用的时候,存储过程需要这样调用:
     call 存储过程名;就ok了!
     再多说一句,因为函数可以返回一个表对象,所以可以在sql语句中直接调用函数,而存储过程不行!!!
     下面说一下触发器;
     在写触发器之前先建立两个表:
     create table Student(studentId int primary key auto_increment,name varchar(30))engine='InnoDB';
     create table BorrowBook(BorrowBookId int primary key auto_increment,studentId int)engine='InnoDB';
     在更新一个学生的学号时,学号更新相应的借书记录的学生学号;
     创建更新触发器如下:
     create trigger updateTrigger before update on Student for each row
     begin
          update BorrowBook set studentId=NEW.studentId where studentId = Student.studentId;
     end
     在删除一个学生记录时,需要删除相应的借书记录
     create trigger deleteTrigger before delete on Student for each row
     begin
          delete from BorrowRecord where studentId=OLD.studentId;
     end
     以后只要你更新学生表或者删除学生的某个记录时,就会调用触发器程序了!!!
     最后,再说一下几个数据库的一点区别:
     Mysql中使用auto_increment,而在sql server中使用identity;
     Mysql中需要显式调用engine='InnoDB'来使数据库实现事务功能,而在oracle中是自动提交的!
     sql server 中使用触发器时,会使用deleted和inserted表,而在mysql中是NEW 和OLD表;
     今天的整理就到此吧。下次继续。。。
<think>好的,用户想学习如何在MySQL中创建表、索引、存储过程触发器,并且需要最佳实践教程。我需要根据提供的引用资料来整理回答,确保覆盖所有要点,同时结构清晰。首先,我需要回顾每个部分的创建方法,并结合引用中的信息添加注意事项和最佳实践。 首先,创建表。用户需要知道基本语法,比如CREATE TABLE,还要注意引擎选择、字符集和主键设计。引用3提到存储过程可以组合多条SQL语句,但这里主要是表的创建,可能引用中没有直接提到,但用户的问题包括创建表,所以需要根据常规知识回答,同时可能引用4提到了备份,可能在最佳实践中需要提到备份表结构。 然后是索引。引用5给出了创建索引的语法,CREATE INDEX,所以需要包含这个例子。同时,最佳实践要提到避免过多索引,选择高区分度的列,联合索引的顺序,这些可能在引用中没有明确,但属于常见的最佳实践。引用3提到索引可能和性能优化有关,所以需要结合这些点。 存储过程部分,引用1和3都有涉及。引用1提到存储过程处理多条SQL,引用3说明存储过程可以包含条件语句和循环。需要展示基本语法,包括DELIMITER,参数类型,以及示例。最佳实践部分要提到模块化、事务管理、权限控制,这些可能需要结合常规知识。 触发器方面,引用2指出只有insert、delete、update能触发触发器,引用3也提到触发器的使用。需要给出创建触发器的语法,示例,以及注意事项,比如避免递归触发,保持简单。最佳实践要提到记录日志、限制执行时间等。 最后,综合实践建议,比如测试、版本控制、备份,引用4提到备份使用mysqldump,所以需要建议备份。 需要确保所有步骤都有代码示例,符合用户练习的需求。同时,生成的相关问题要覆盖索引优化、存储过程调试、触发器应用场景等,参考引用中的内容来设计问题。 检查是否有遗漏的部分,比如创建表时的字段类型、存储过程的参数类型(IN/OUT/INOUT),触发器的BEFORE和AFTER区别。确保回答的结构清晰,分步骤说明,每个部分有示例和最佳实践,最后给出综合建议和相关问题。</think>### MySQL创建表、索引、存储过程触发器的分步教程 --- #### 一、创建表的最佳实践 **1. 基础语法** ```sql CREATE TABLE 表名 ( 列名1 数据类型 [约束条件], 列名2 数据类型 [约束条件], ... ) ENGINE=存储引擎 DEFAULT CHARSET=字符集; ``` **2. 示例** ```sql CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, salary DECIMAL(10,2), hire_date DATE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` **3. 最佳实践** - **选择存储引擎**:优先使用支持事务的`InnoDB`[^1]。 - **字符集统一**:推荐`utf8mb4`以支持特殊字符和表情。 - **主键设计**:自增整数(如`AUTO_INCREMENT`)或业务无关的唯一值[^3]。 - **避免宽表**:单表字段建议不超过50个,减少冗余字段。 --- #### 二、创建索引的优化方法 **1. 基础语法** ```sql -- 单列索引 CREATE INDEX idx_name ON employees(name); -- 联合索引 CREATE INDEX idx_salary_hire ON employees(salary, hire_date); ``` **2. 最佳实践** - **高频查询字段优先**:如常用于`WHERE`或`JOIN`的列[^5]。 - **联合索引顺序**:区分度高的列在前(如`salary`比`hire_date`区分度高)。 - **避免过度索引**:每个索引增加写操作开销,删除未使用的索引。 - **覆盖索引优化**:通过索引直接获取数据,减少回表查询。 --- #### 三、存储过程开发规范 **1. 基础语法** ```sql DELIMITER $$ CREATE PROCEDURE 存储过程名(IN 参数1 类型, OUT 参数2 类型) BEGIN -- SQL逻辑(支持条件、循环) SELECT * FROM employees WHERE salary > 参数1; END $$ DELIMITER ; ``` **2. 示例(计算平均工资)** ```sql DELIMITER $$ CREATE PROCEDURE GetAvgSalary(IN dept_id INT, OUT avg_salary DECIMAL(10,2)) BEGIN SELECT AVG(salary) INTO avg_salary FROM employees WHERE department_id = dept_id; END $$ DELIMITER ; ``` **3. 最佳实践** - **模块化设计**:拆分复杂逻辑为多个小过程。 - **事务控制**:对数据一致性要求高的操作添加`COMMIT/ROLLBACK`。 - **参数验证**:使用`IF`语句检查输入合法性。 - **权限隔离**:通过`GRANT EXECUTE`限制访问权限[^4]。 --- #### 四、触发器的合理使用 **1. 基础语法** ```sql CREATE TRIGGER 触发器名 BEFORE/AFTER INSERT/UPDATE/DELETE ON 表名 FOR EACH ROW BEGIN -- 触发时执行的逻辑(如日志记录) INSERT INTO audit_log VALUES(NEW.id, NOW()); END; ``` **2. 示例(审计日志)** ```sql CREATE TRIGGER log_salary_change AFTER UPDATE ON employees FOR EACH ROW BEGIN IF OLD.salary <> NEW.salary THEN INSERT INTO salary_changes(employee_id, old_salary, new_salary) VALUES (OLD.id, OLD.salary, NEW.salary); END IF; END; ``` **3. 最佳实践** - **避免递归触发**:确保触发器不会触发自身[^2]。 - **轻量级逻辑**:禁止在触发器中执行复杂查询或远程调用。 - **记录异常**:添加`TRY...CATCH`块捕获错误(需结合存储过程)[^3]。 - **命名清晰**:如`trg_[表名]_[操作]_[动作]`。 --- #### 五、综合实践建议 1. **测试环境验证**:所有对象创建前需在非生产环境测试。 2. **版本控制**:将DDL语句(如`CREATE TABLE`)纳入Git管理[^4]。 3. **备份策略**:使用`mysqldump`定期备份表结构和数据[^4]。 4. **性能监控**:通过`EXPLAIN`分析索引效果,`SHOW PROCEDURE STATUS`查看存储过程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值