注册 登录  
 加关注

网易博客网站关停、迁移的公告:

将从2018年11月30日00:00起正式停止网易博客运营
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老狗的博客

尽管每一步都很微小,但我确认我在进步

 
 
 

日志

 
 
关于我
sky

认真生活,努力工作 热爱技术,关注DB,存储,分布式,中间层,java,c++,php

网易考拉推荐

mysql语句语法【个人笔记】  

2012-06-25 16:19:39|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 外键

外键的语法如下:

constraint [constraint_name] foreign key [index_name] 
(column_name,...) references 
tablename(column_name)
on delete reference_option
on update reference_option;

需要注意的地方:
a. constraint_name 和 index_name不同,在建立外键的同时会默认为这一列建立索引结果,constraint_name指的是外键约束的名字, index_name指的是索引的名字
实例:

mysql> create table testchild(bookid int unsigned not null auto_increment primar
y key,bookname varchar(30),userid int unsigned,constraint fk_userid foreign key
fk_userid(userid) references testparent(userid))engine=innodb;

创建外键以后,show create table查看如下:

Create Table: CREATE TABLE `testchild` (
  `bookid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `bookname` varchar(30) DEFAULT NULL,
  `userid` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`bookid`),
  KEY `fk_userid` (`userid`),
  CONSTRAINT `fk_userid` FOREIGN KEY (`userid`) REFERENCES `testparent` (`userid
`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk

b. 引用表和别引用表必须都是innodb表,而且不能是临时表
c. innodb需要在被引用表的列上建立索引,如果没有索引,则会报如下错误

ERROR 1005 (HY000): Can't create table 'test.#sql-f38_17' (errno: 150)

d. reference option 可以有四个:set null,cascade,no action,restrict,默认为restrict,等同于no action, 在被引用表上删除数据的时候,如果引用表中还有相关数据,则主表无法删除

触发器

trigger语法如下:

CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body

a.  mysql不支持在同一个表上,对同样的事件和触发时间,建立多个触发器

mysql> create table t1(a int,b int)engine=innodb;
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON t1
    -> FOR EACH ROW SET @sum = @sum + NEW.a;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TRIGGER update_sum BEFORE update ON t1
    -> FOR EACH ROW SET @sum = @sum + NEW.a;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TRIGGER ins_sum1 BEFORE INSERT ON t1
    -> FOR EACH ROW SET @sum = @sum + NEW.a;
ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'
b. 触发器的上下文环境可以有两种,一种是definer, 另外一种是invoker,即调用者上下文和被调用者上下文,在mysql中,默认是definer,即调用者上下文

c. 删除表的同时,触发器也会删除掉

d. 注意目前mysql trigger只有行级别触发器

e. NEW 和OLD的使用,注意对于大小写并不敏感,你可以用NEW,也可以用new,  使用形式new.colname, 对于insert,只有new,没有old, 对于Update,既有new也有old, 对于delete,只有old,没有new

f. 需要注意,trigger所在的库必须和其依赖的表是同一个schema,否则会报错

mysql> delimiter //
mysql> create trigger test1.trig_insert_testint before insert on test.testint
-> for each row
-> begin
-> if new.b < 0 then
-> set new.b = 0;
-> end if;
-> end;//
ERROR 1435 (HY000): Trigger in wrong schema

mysql> delimiter ;
mysql> delimiter //
mysql> create trigger test.trig_insert_testint before insert on test.testint
-> for each row
-> begin
-> if new.b < 0 then
-> set new.b = 0;
-> end if;
-> end;//
Query OK, 0 rows affected (0.06 sec)

字符集


结论:alter table xx default character set 不会改变表中原有数据的字符集类型,而alter table xx conver to 会改变表中原有列的数据的字符类型,为了保证表中数据和默认字符集一致,建议使用convert to

测试过程如下:

mysql> show create table testint\G
*************************** 1. row ***************************
Table: testint
Create Table: CREATE TABLE `testint` (
`a` int(10) unsigned NOT NULL AUTO_INCREMENT,
`b` varchar(100) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)


mysql> select count(*) from testint;
+----------+
| count(*) |
+----------+
| 1572864 |
+----------+
1 row in set (1.19 sec)


E:\mysql\data\test1 的目录

2012-09-25 12:03 <DIR> .
2012-09-25 12:03 <DIR> ..
2012-06-22 09:47 59 db.opt
2012-09-25 12:02 8,602 testint.frm
2012-09-25 12:03 125,829,120 testint.ibd
3 个文件 125,837,781 字节
2 个目录 26,766,782,464 可用字节


mysql> alter table testint default character set = utf8;
Query OK, 1572864 rows affected (39.20 sec)
Records: 1572864 Duplicates: 0 Warnings: 0


E:\mysql\data\test1 的目录

2012-09-25 12:03 <DIR> .
2012-09-25 12:03 <DIR> ..
2012-06-22 09:47 59 db.opt
2012-09-25 12:02 8,602 testint.frm
2012-09-25 12:03 125,829,120 testint.ibd
3 个文件 125,837,781 字节
2 个目录 26,766,782,464 可用字节

mysql> alter table testint default character set = gbk;
Query OK, 1572864 rows affected (38.35 sec)
Records: 1572864 Duplicates: 0 Warnings: 0

mysql> select * from testint limit 3;
+---+--------+------+
| a | b | c |
+---+--------+------+
| 1 | 中国人 | 100 |
| 2 | 日本人 | 200 |
| 3 | 美国人 | 300 |
+---+--------+------+
3 rows in set (0.00 sec)


E:\mysql\data\test1 的目录

2012-09-25 12:03 <DIR> .
2012-09-25 12:03 <DIR> ..
2012-06-22 09:47 59 db.opt
2012-09-25 12:02 8,602 testint.frm
2012-09-25 12:03 125,829,120 testint.ibd
3 个文件 125,837,781 字节
2 个目录 26,766,782,464 可用字节


mysql> show create table testint\G
*************************** 1. row ***************************
Table: testint
Create Table: CREATE TABLE `testint` (
`a` int(10) unsigned NOT NULL AUTO_INCREMENT,
`b` varchar(100) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=1834967 DEFAULT CHARSET=gbk
1 row in set (0.00 sec)


mysql> alter table testint convert to character set utf8;
Query OK, 3145728 rows affected (1 min 26.92 sec)
Records: 3145728 Duplicates: 0 Warnings: 0



E:\mysql\data\test1 的目录

2012-09-25 12:07 <DIR> .
2012-09-25 12:07 <DIR> ..
2012-06-22 09:47 59 db.opt
2012-09-25 12:06 8,602 testint.frm
2012-09-25 12:07 138,412,032 testint.ibd
3 个文件 138,420,693 字节
2 个目录 26,238,300,160 可用字节


索引

一个索引列可以有asc/desc关键字,这个关键字现在没用,未来可能会做扩展
An index_col_name specification can end with ASC or DESC. These keywords are permitted for future extensions for specifying ascending or descending index value storage. Currently, they are parsed but ignored; index values are always stored in ascending order.


  评论这张
 
阅读(1129)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018