首页 > 代码库 > MySQL笔记
MySQL笔记
1,配置path环境变量,到bin目录
C:\Program Files\MySQL\MySQL Server 5.0\bin
2,启动MySQL服务
DOS命令: net start MySQL (ipconfig 查看本机IP)
登录: mysql -u root -p (回车)
Enter password: 123
==>(-h:主机名,本机登录不用) -u:用户名 -p:密码
3,退出 exit;
4,展示所有数据库 show databases;
5,使用数据库 use mysql;
6,展示所有的表 show tables;
7,查询数据 select * from user \G;
8,更改用户密码 update user set password=password(‘新密码‘) where user=‘root‘;
==>flush privileges; 刷新权限命令
9,寻求帮助 ? show;
10,创建数据库 create database ‘bdqn‘;
11,删除数据库 drop database ‘bdqn‘;
12,创建表
create table `bdqn`.`users`(
`userId` int NOT NULL AUTO_INCREMENT COMMENT ‘用户编号,主键‘,
`userName` varchar(20) NOT NULL DEFAULT ‘匿名‘ COMMENT ‘用户姓名‘,
PRIMARY KEY (`userId`)
)
13,创建数据库
create database 数据库名;
14,删除数据库
dorp database 数据库名;
15,查看数据库
show databases;
16,使用数据库
use 数据库名;
17,创建数据表
create table [if not exists] `表名`(
`字段名1` 列类型[属性][索引][注释],
`字段名2` 列类型[属性][索引][注释],
);
注意:反引号(1左边位置``)用于区别mysql保留字与普通字符而引入的 (可以省略)
18,列类型
1):数值类型:
类型 说明
tinyint 非常小的数据
smallint 较小的数据
mediumint 中等大小的数据
int 标准整数 int(4) 查询结果低于4位的按4位展示,如12显示为0012,超过4位正常显示
bigint 较大的整数
float 单精度浮点数
double 双精度浮点数
decimal 字符串形式的浮点数 decimal(m,d) 如decimal(5,2) 5位数小数2位 推荐使用,float 和 double 存在精度损失
2):字符串类型
类型 说明
char[(M)] 固定长字符串,检索快但费空间 0 <= M <= 255
varchar[(M)] 可变字符串 0 <= M <= 65535
tinytext 微型文本串
text 文本串
3):日期和时间类型
类型 说明
date YYYY-MM-DD
time Hh:mm:ss
DATETIME YY-MM-DD hh:mm:ss
TIMESTAMP YYYYMMDDhhmmss格式表示的时间戳(一般用来验证数据是否被修改) 使用时间的默认值 NOW(),列类型必须是 TIMESTAMP
YEAR yyyy格式的年份值
19,属性
1):unsigned 无符号的,声明该数据列不允许负数
2):zerofill 0填充,不足位数的用0来补充(如int(4), 5则为0005)
3):auto_increment 自增的,通常用于设置主键,且为整数类型,每添加一条数据,自动在上一个记录数上加1,可定义起始值
4):null 和 not null 默认为null,即没有插入该列的数值,如果设置为not null,则该列必须有值
5):default 默认的,用于设置默认值
20,NULL值
理解为"没有值"或"未知值"
不要用NULL进行算术运算,结果仍为NULL
MySQL中,0或NULL都意味着假,1为真
21,删除数据
delete from 表名;
注意: delete删除所有数据不会影响自增列 , 需使用 truncate;
delete from 表名; auto_increment 没有影响
truncate 表名;重新设置 auto_increment , 对事务没有影响,速度更快
22,设置自增列
CREATE TABLE t4(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
sname CHAR(4)
)AUTO_INCREMENT=100;
23,设置数据表类型
create table 表名(
)engine = MyISAM 或 InnoDB
常见MySQL的数据表类型: MyISAM, InnoDB, HEAP, BOB, CSV
名称 MyISAM InnoDB(适合增删改,默认)
*事务处理 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
*全文索引 支持 不支持
表空间大小 较小 较大,约2倍
24,数据表的存储位置
文件方式存储在磁盘中,包括表文件,数据文件以及数据库的选项文件
位置:MySQL安装目录\data下存放数据表. 目录名对应数据库名,该目录下文件名对应数据表
1):InnoDB类型数据表只有一个 *.frm 文件,以及上一级目录的 ibdata1 文件
2):MyISAM类型数据表对应三个文件:
*.frm -- 表结构定义文件
*.MYD -- 数据文件
*.MYI -- 索引文件
25,设置当前数据库字符编码
set names 字符编码;
26,创建数据表(库)时指定字符集
create table 表名(
)charset= utf-8;
如无设定,则根据MySQL数据库配置文件 my.ini 中的参数设定,如 character-set-sever=utf8
27,删除指定数据
delete from 表名 where 条件;
28,修改数据表
1):修改表名
alter table 旧表名 rename as 新表名
2):添加字段
alter table 表名 add 字段名 列类型[属性] [first | after 字段名]
3):修改字段
alter table 表名 modify 字段名 列类型[属性]
alter table 表名 change 旧字段名 新字段名 列类型[属性]
4):删除字段
alter table 表名 drop 字段名
29,删除表
drop table [if exists] 表名
30,DML 数据操作语言
insert : insert into 表名 [字段1, 字段2...] values (值1, 值2...) 可同时插入多条数据,values后用英文逗号隔开
如: INSERT INTO teacher VALUES(1001,"格格"),(1002,"紫薇"),(1003,"测试");
update :
UPDATE t5 SET sname = SUBSTRING(sname,1,2) WHERE id = 102;
substring(filed,m):截取filed字段从第m个字符开始到结束的字符串;
substring(filed,m,n):截取filed字段从第m个字符开始的长度为n的字符串;
注意:substring 索引从1开始
UPDATE t5 SET sname = CONCAT(‘r‘,sname) WHERE id = 101;
UPDATE t5 SET sname = CONCAT(sname,‘rt‘) WHERE id = 101;
concat 添加 前缀 或 后缀 字符串
delete :
truncate : 用于完全清空表数据,但表结构,索引,约束等不变 , 没有条件
语法: truncate table table_name;
和 delete 区别:
相同:都能删除数据,不删除表结构,但truncate速度更快
不同:使用truncate table 重新设置 auto_increment 计数器(自增列)
使用truncate table 不会对事务有影响
31,mysql事务实现方式
set autocommit = 0 ; #关闭自动提交模式
set autocommit = 1 ; #开启自动提交模式
mysql中默认是自动提交
**使用事务时应先关闭自动提交
set autocommit = 0
关闭MySQL的自动提交
start transaction
开始一个事务,标记事务的起始点
commit 或 rollback
提交一个事务给数据库 将事务回滚,数据回到本次事务的初始状态
set autocommit = 1;
还原MySQL数据库的自动提交
--------------------
CRUD : 增删改查
--------------------
设置 MySQL 为严格模式
set sql_mode = ‘strict_trans_tables‘;
--------------------------------------
原子性,一致性,隔离性,持久性(ACID)
---------------------------------------
32, count(*) 统计 eg : SELECT COUNT(studentno) 学生总人数 FROM bdqn_student;
33, as 别名,可以省略, 可以加引号,也可以不加
34, distinct 去重 eg : SELECT DISTINCT r.SubjectNo FROM result r;
==>如有多列,按整体算没有重复的则显示
35, concat 前缀 eg : SELECT CONCAT(‘学生:‘, b.StudentName) 姓名, b.Address 地址 FROM bdqn_student b;
36, SELECT VERSION(); 查询版本号
==> 避免SQL返回结果中包含".", "*"和括号干扰开发语言程序,父:
SELECT VERSION()AS mysql_v, 123.44*100 AS expression;
-->表头"123.44*100"使用别名 返回结果不会与后台开发程序发生混淆
37, 逻辑操作符
and或&&
or或||
xor或^
not或!
38,比较操作符
is null
is not null
between and (推荐 <= 更优越)
like
in
39,ESCAPE 定义转义符
40, % 任意字符 0个或多个
_ 任意一个字符
41, LIMIT [m,]n 或 LIMIT n OFFSET m
例如:
select * from result limit 5; //返回前5条记录
select * from result limit 5,10 //返回6-15条记录 (从大于5开始返回10条记录)
42, SHOW COLUMNS FROM 数据表: 等价于 desc 数据表;
显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。
43,SHOW INDEX FROM 数据表:
显示数据表的详细索引信息,包括PRIMARY KEY(主键)。
44,SHOW TABLE STATUS LIKE [FROM db_name] [LIKE ‘pattern‘] \G:
该命令将输出Mysql数据库管理系统的性能及统计信息。
mysql> SHOW TABLE STATUS FROM bdqn; # 显示数据库 RUNOOB 中所有表的信息
mysql> SHOW TABLE STATUS from bdqn LIKE ‘student%‘; # 表名以runoob开头的表的信息
mysql> SHOW TABLE STATUS from bdqn LIKE ‘student%‘\G; # 加上 \G,查询结果按列打印
45,MySQL客户端输出窗口显示中文乱码问题解决办法
第一步 :先查看字符集编码:show variables like ‘%char%‘;
第二步:之所以会显示乱码,就是因为MySQL客户端输出窗口显示中文时使用的字符编码不对造成的
现在是使用utf8字符编码来显示中文数据的,但是因为操作系统是中文操作系统,默认使用的字符集是GB2312,
所以需要把输出窗口使用的字符编码改成gb2312才能够正常显示中文。使用如下的命令设置输出窗口使用的字符编码
第三步: set character_set_results=gb2312; ==>显示结果乱码
set character_set_client=gb2312;
set character_set_connection=gb2312; ==>输入中文乱码
---->以上一句话解决:set names gb2312; 命令用于设置使用的字符集。
注意utf8与UTF-8的分别.
utf8的好处是java虚拟机可以自动将它与gbk进行转换,因而显示都不会有乱码。可是在控制台下(cmd),显示就有问题了
在java程序里边使用"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"这样的url,表明使用GBK进行编码。
46,MySQL 正则表达式
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n‘ 或 ‘\r‘ 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n‘ 或 ‘\r‘ 之前的位置。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 ‘\n‘ 在内的任何字符,请使用象 ‘[.\n]‘ 的模式。
[...] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]‘ 可以匹配 "plain" 中的 ‘a‘。
[^...] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]‘ 可以匹配 "plain" 中的‘p‘。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,‘z|food‘ 能匹配 "z" 或 "food"。‘(z|f)ood‘ 则匹配 "zood" 或 "food"。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,‘zo+‘ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}‘ 不能匹配 "Bob" 中的 ‘o‘,但是能匹配 "food" 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
例:
查找name字段中以‘st‘为开头的所有数据:mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^st‘;
查找name字段中以‘ok‘为结尾的所有数据:mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘ok$‘;
查找name字段中包含‘mar‘字符串的所有数据:mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘mar‘;
查找name字段中以元音字符开头或以‘ok‘字符串结尾的所有数据:mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^[aeiou]|ok$‘;
47,默认值 增加及修改
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
48, 数据表 类型及修改
查看数据表类型: SHOW TABLE STATUS LIKE ‘student‘\G;
修改数据表类型: ALTER TABLE student ENGINE = MYISAM;
49,修改表名
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
50,MySQL 索引
1)普通索引
创建索引 : CREATE INDEX indexName ON mytable(username(length));
已有索引给表添加索引:ALTER mytable ADD INDEX [indexName] ON (username(length))
创建表时直接指定:
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
删除索引 : DROP INDEX [indexName] ON mytable;
2)唯一索引 ====>注意,唯一索引列不能有重复数据,否则报 duplicate entry *** for key 2;
创建索引 : CREATE UNIQUE INDEX indexName ON mytable(username(length))
已有索引给表添加索引:ALTER table mytable ADD UNIQUE [indexName] (username(length))
创建表时直接指定:
UNIQUE [indexName] (username(length))
使用ALTER 命令添加和删除索引
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
使用 ALTER 命令添加和删除主键
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
显示索引信息
mysql> SHOW INDEX FROM table_name; \G
51,MySQL 临时表
MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。
CREATE TEMPORARY TABLE SalesSummary
当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 SalesSummary表。
如果你退出当前MySQL会话,再使用 SELECT命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。
如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。
删除MySQL 临时表 DROP TABLE SalesSummary;
52,MySQL 复制表
如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的。
*使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
*复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
*如果你想复制表的内容,你就可以使用 INSERT INTO ... SELECT 语句来实现。
53,MySQL 元数据
查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数。
数据库和数据表的信息: 包含了数据库及数据表的结构信息。
MySQL服务器信息: 包含了数据库服务器的当前状态,版本号等。
命令 描述
SELECT VERSION( ) 服务器版本信息
SELECT DATABASE( ) 当前数据库名 (或者返回空)
SELECT USER( ) 当前用户名
SHOW STATUS 服务器状态
SHOW VARIABLES 服务器配置变量
54,MySQL 序列使用
mysql> ALTER TABLE t AUTO_INCREMENT = 100;
55,MySQL 处理重复数据
1):INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,
如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
如: INSERT IGNORE INTO t5 VALUES(101,‘tert‘,‘dd‘);
2):INSERT IGNORE INTO当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。
而REPLACE INTO into如果存在primary 或 unique相同的记录,则先删除掉。再插入新记录。
如: REPLACE INTO t5 VALUES(101,‘tert‘,‘dd‘);
3):统计重复数据
如: SELECT COUNT(*) AS total , userName FROM users GROUP BY username HAVING total >= 2;
*确定哪一列包含的值可能会重复。
*在列选择列表使用COUNT(*)列出的那些列。
*在GROUP BY子句中列出的列。
*HAVING子句设置重复数大于1。
4):过滤重复数据
使用 DISTINCT 关键字来过滤重复数据
如: SELECT DISTINCT userName FROM users;
使用 GROUP BY 来读取数据表中不重复的数据
如: SELECT userName FROM users GROUP BY username;
5);删除重复数据
新建表
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
-> FROM person_tbl;
-> GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
添加索引
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);
56,MySQL 及 SQL 注入
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。
采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
57,MySQL 导出数据
1):导出到 TXT
SELECT * FROM users INTO OUTFILE ‘f:/users.txt‘;
2):值用逗号隔开并换行
SELECT * FROM users INTO OUTFILE ‘f:/users3.txt‘ FIELDS TERMINATED BY ‘,‘ LINES TERMINATED BY ‘\r\n‘;
3):值用逗号隔开,加引号并换行
SELECT * FROM users INTO OUTFILE ‘f:/users2.txt‘ FIELDS TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘ LINES TERMINATED BY ‘\r\n‘;
FIELDS TERMINATED BY ‘,‘ : 表示每列以 逗号 隔开
ENCLOSED BY ‘"‘ : 表示值加引号
LINES TERMINATED BY ‘\r\n‘ : 表示回车并换行
===>注意:输出不能是一个已存在的文件。防止文件数据被篡改。
58,MySQL 导入数据
load data infile ‘file_name‘ into table tb_name;
mysqlimport的常用选项介绍
选项 功能
-d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息
-f or --force 不管是否遇到错误,mysqlimport将强制继续插入数据
-i or --ignore mysqlimport跳过或者忽略那些有相同唯一 关键字的行, 导入文件中的数据将被忽略。
-l or -lock-tables 数据被插入之前锁住表,这样就防止了, 你在更新数据库时,用户的查询和更新受到影响。
-r or -replace 这个选项与-i选项的作用相反;此选项将替代 表中有相同唯一关键字的记录。
--fields-enclosed- by= char 指定文本文件中数据的记录时以什么括起的, 很多情况下 数据以双引号括起。 默认的情况下数据是没有被字符括起的。
--fields-terminated- by=char 指定各个数据的值之间的分隔符,在句号分隔的文件中, 分隔符是句号。您可以用此选项指定数据之间的分隔符。
默认的分隔符是跳格符(Tab)
--lines-terminated- by=str 此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。 默认的情况下mysqlimport以newline为行分隔符。
您可以选择用一个字符串来替代一个单个的字符: 一个新行或者一个回车。
59,MySQL数据库备份
>mysqldump -u root -p 数据库名[表名1,表名2...] > 绝对路径名文件,如 d:/myschool.sql
EnterPassword:***
60.MySQL数据库恢复
mysql -u root - p 数据名 < 文件名,如 d:/myschool.sql
或
source d:/myschool.sql;
61,表设计
1:N : 多的一方添加另一方主键作为外键
M:N : 必须引入第三张关系数据表,同时引入另两张表的主键作为外键
62, mysql 类型 Java 类型
datetime Timestamp ---> Date date = new Date(); Timestamp tamp = new Timestamp(date.getTime()); --> rs.getTimestamp("createtime")
decimal BigDecimal ---> BigDecimal.doubleValue() 返回 double 类型 -->rs.getBigDecimal("bookprice")
63,触发器
示例:新增时记录
DELIMITER $ CREATE TRIGGER tr_student_insert AFTER INSERT ON student FOR EACH ROW BEGIN SET @txt = CONCAT(‘新增学生:[id:‘,new.id,‘,name:‘,new.name,‘,city:‘,new.city,‘,age:‘,new.age,‘,gradeId:‘,new.gradeId,‘]‘); INSERT INTO student_log VALUES(NULL,‘新增‘,@txt,‘admin‘,NOW()); END $ DELIMITER ;
修改:
DELIMITER $ CREATE TRIGGER tr_student_update AFTER UPDATE ON student FOR EACH ROW BEGIN SET @txt = CONCAT(‘修改学生:修改前[id:‘,old.id,‘,name:‘,old.name,‘,city:‘,old.city,‘,age:‘,old.age,‘,gradeId:‘,old.gradeId,‘]修改后[id:‘,new.id,‘,name:‘,new.name,‘,city:‘,new.city,‘,age:‘,new.age,‘,gradeId:‘,new.gradeId,‘]‘); INSERT INTO student_log VALUES(NULL,‘修改‘,@txt,‘admin‘,NOW()); END $ DELIMITER ;
删除:
1 DELIMITER $ 2 CREATE TRIGGER tr_student_delete AFTER DELETE ON student FOR EACH ROW 3 BEGIN 4 SET @txt = CONCAT(‘删除学生:[id:‘,old.id,‘,name:‘,old.name,‘,city:‘,old.city,‘,age:‘,old.age,‘,gradeId:‘,old.gradeId,‘]‘); 5 INSERT INTO student_log VALUES(NULL,‘删除‘,@txt,‘admin‘,NOW()); 6 END $ 7 DELIMITER ;
注意: 1,MySQL 不能将 insert,update,delete 放在一起,需分开建; 当前系统时间使用 NOW();
2,oracle支持 or replace 而mysql是不可以的
3,oracle在使用的变量要在begin前面声明。而mysql则用 @ 符号直接使用
4,oracle变量赋值用的是 := ,而mysql用的是 = 。
5,oracle新表和旧表用的是:new 和:old,而mysql用的是new 和old。
ORACLE 示例:
1 CREATE OR REPLACE TRIGGER tr_teacher AFTER INSERT OR UPDATE OR DELETE ON teacher FOR EACH ROW 2 declare 3 v_opt_type teacher_log.opt_type%TYPE; 4 v_old_value teacher_log.old_value%TYPE; 5 v_tno teacher_log.tno%TYPE; 6 begin 7 IF inserting THEN 8 v_opt_type:=1; 9 v_tno:=:new.tno; 10 ELSIF deleting THEN 11 v_opt_type:=2; 12 v_tno:=:old.tno; 13 v_old_value:=:old.tname||‘,‘||:old.sal||‘,‘||:old.comm; 14 ELSE 15 v_opt_type:=3; 16 v_tno:=:old.tno; 17 v_old_value:=:old.tname||‘,‘||:old.sal||‘,‘||:old.comm; 18 END IF; 19 INSERT INTO teacher_log VALUES(sq_log.nextval,v_old_value,SYSDATE,v_opt_type,v_tno); 20 end tr_teacher;
MySQL笔记