您的位置:首页 > 数据库 > MySQL

MySQL学习笔记 1

2015-04-09 08:46 120 查看
1. 表的MyISAM和InnoDB的区别

事务处理。InnoDB支持事务功能,MyISAM不支持。

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择;InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表.

锁机制不同。InnoDB 为行级锁,MyISAM为表级锁。注意:当数据库无法确定,所找的行时,也会变为锁定整个表。: update table set num = 10 where username like "%test%";

两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。

2. 外键约束的时候怎样update和delete,具体delete的几个方法

MySQL有两种常用的引擎类型:MyISAM和InnoDB。目前只有InnoDB引擎类型支持外键约束。InnoDB中外键约束定义的语法如下:

[CONSTRAINT [symbol]] FOREIGN KEY

[index_name] (index_col_name, ...)

REFERENCES tbl_name (index_col_name,...)

[ON DELETE reference_option]

[ON UPDATE reference_option]

reference_option:

RESTRICT | CASCADE | SET NULL | NO ACTION 外键的使用需要满足下列的条件:

1. 两张表必须都是InnoDB表,并且它们没有临时表。

2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。

3. 建立外键关系的对应列必须建立了索引。

4. 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。

如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:

1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。

2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。

3. NO ACTION: InnoDB拒绝删除或者更新父表。

4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。

5. SET DEFAULT: InnoDB目前不支持。

外键约束使用最多的两种情况无外乎:

1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;

2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

前一种情况,在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;后一种情况,可以使用ON UPDATE CASCADE ON DELETE CASCADE。

InnoDB允许你使用ALTER TABLE在一个已经存在的表上增加一个新的外键:

ALTER TABLE tbl_name

ADD [CONSTRAINT [symbol]] FOREIGN KEY

[index_name] (index_col_name, ...)

REFERENCES tbl_name (index_col_name,...)

[ON DELETE reference_option]

[ON UPDATE reference_option]

InnoDB也支持使用ALTER TABLE来删除外键:

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

3. MySQL事物

一般来说,事务是必须满足4个条件(ACID)

原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库得影响!

一致性(Consistency):事务得操作应该使使数据库从一个一致状态转变倒另一个一致得状态!就拿网上购物来说吧,你只有即让商品出库,又让商品进入顾客得购物篮才能构成事务!

隔离性(Isolation):如果多个事务并发执行,应象各个事务独立执行一样!

持久性(Durability):一个成功执行得事务对数据库得作用是持久得,即使数据库应故障出错,也应该能够恢复!

MYSQL的事务处理主要有两种方法。

1、用begin,rollback,commit来实现

begin 开始一个事务

rollback 事务回滚

commit 事务确认

2、直接用set来改变mysql的自动提交模式

可以通过:SHOW VARIABLES LIKE 'autocommit' 获取autocommit的值.

MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过

set autocommit=0 禁止自动提交

set autocommit=1 开启自动提交

来实现事务的处理。

但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!

MySQL中只有InnoDB和BDB类型的数据表才能支持事务处理!其他的类型是不支持.

4. unique key 可以是hash和btree,分别是什么,区别是什么。为什么有的字段没有uniq也可以是btree

其实uniq和hash,btree没直接关系.

unique key表示这个字段里面的值是唯一的,primary key自带这个属性.

说实话,hash的效率比btree高,但由于hash的hash值的特点,很多操作无法进行,因此用得多的仍然是btree.

Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。

Hash 索引无法进行数据的排序操作。

Hash 索引在任何时候都不能避免表扫描。因为存在不同的索引值计算出相同的hash值的情况,这时还是得访问表中的实际数据,与实际数据进行比较才能得到结果.因此Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

所以btree用的反而比hash多.

5. tinyint和int的区别

tinyint 1个字节

int 4个字节

6. datetime和timestamp的区别

datetime的范围比timestamp大.datetime从'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59',timestamp从'1970-01-01 00:00:01'  到 '2038-01-09 03:14:07'.但timestamp默认是插入当前时间的,datetime的话,插入null就是null了.从下面的定义中也可以很明显的看出这点区别.

CREATE TABLE `tTime` (

`id` int(11) DEFAULT NULL,

`fdt` datetime DEFAULT NULL,

`dts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

) ENGINE=InnoDB DEFAULT CHARSET=utf8

7 char和varchar

都是字符串的类型,不同的是char(n)规定这个字段的长度是n个,则按n个字符长度存储.varchar(n)规定的是这个字符串的最大长度,没到这个长度按字符串实际长度存储.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: