主键作用:能保证设置主键的列非空且唯一.另外,在定义主键时,如果这列之前没有索引,系统会为其创建唯一性索引
外键作用:能保证设置外键的列取值必须匹配父表中已有的值.通过外键可以与同一张表的列建立引用关系,也可以与不同表的列建立引用关系
索引的有点如下:
1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;
2.可以大大加快数据的检索速度,这也是创建索引的最主要的原因;
3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义;
4.在使用分组和排序子句进行数据检索式,同样可以显著减少查询中分组和排序的时间;
5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能.
索引的缺点如下:
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大;
3.当对表中的数据进行增加,删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度;
4.如果给不适合创建索引的列创建了索引,不会提高性能.
1.主键时为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引;
2.数据表中只允许有一个主键,但是可以有多个索引;
3.使用主键数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率;
4.索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描;
5.主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯一索引;
6.唯一索引则标识该索引值唯一,可以由一个或几个字段组成,一个表可以由多个唯一索引.
不一定.
如果给不适合创建索引的列创建了索引, 不会提高性能.
视图(VIEW)是一个虚拟表,其内容由查询定义.同真是的表一样,视图包含系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成.
视图在数据库中不存储数据值,即不占空间.只在系统表中存储对视图的定义.
视图实际上就是一条SELECT语句,类似Windows中的快捷方式.
事务,是指作为单个逻辑工作单元执行的一系列操作.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠.
事务的四个特性ACID,分别表示:
原子性(atomicity):一个事务或者完全发生,或者完全不发生;
一致性(consistency):事务把数据库从一个一致状态转变到另一个状态;
隔离性(isolation):在事务提交之前,其他事务觉察不到事务的影响;
持久性(durability):一旦事务提交,它是永久的.
1.TRUNCATE删除表内容释放表空间保留表结构(即:只删除表内的数据,不删除表本身.相当于DELETE语句不写WHERE子句一样),不适用事务处理即和事务无关.TRUNCATE删除表内容,数据不可以回滚.DELETE后面可跟WHERE子句,TRUNCATE则不可以.TRUNCATE比DELETE的删除数据的速度快.
2.DELETE属于数据操作语言(DML),不能自动提交事务,需commit提交.这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
DROP属于数据定义语言(DDL)可以自动提交事务;DROP语句将删除表的结构,依赖的约束(constraint),触发器(trigger),索引(index);删除表数据同时删除表结构;依赖于该表的存储过程/函数将保留,但是变为失效状态.
存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量,有条件自行以及其他强大的编程功能.存储过程可包含程序流,逻辑以及对数据库的查询.它们可以接受参数,输出参数,返回单个或多结果集以及返回值.可以出于任何使用SQL语句的目的来使用存储过程,它具有以下优点:
1.可以在单个存储过程中执行一系列SQL语句.
2.可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句.
3.存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句快.
触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE,INSERT,或DELETE.触发器可以查询其它表,而且可以包含复杂的SQL语句.它们主要用于强制复杂的业务规则或要求.例如,可以控制是否允许基于顾客的当前账户状态插入订单.触发器还有助于强制引用完整性,以便在添加,更新或删除表中的行时保留表之间已定义的关系.然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束.如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束.
触发器的有点如下:
1.触发器是自动的:它们在对表的数据做了任何修改(比如手工输入或者应用程序采取的操作)之后即被激活.
2.触发器可以通过数据库中的相关表进行层叠更改.例如,可以在titles表的title_id列上写入一个删除触发器,以使其他表中的各匹配行采取删除操作.该触发器用title_id列作为唯一键,在titleauthor,sales及roysched表中对各匹配进行定位.
3.触发器可以强制限制,这些限制比用CHECK约束所定义的更复杂.与CHECK约束不同的是,触发器可以引用其它表中的列.例如,触发器可以回滚试图对价格低于10美元的书(存储在titles表中)应用折扣(存储在discounts表中)的更新.
存储过程是用户定义的一系列SQL语句的姐,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表.具体区别如下:
1.对于存储过程来说可以返回参数,而函数只能返回值或者表对象.
2.函数必须有返回值,存储过程可有可无
3.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一部分来调用.
ID(pri)(Auto) name pass
1 aaa 111
2 bbb 222
3 ccc 333
ID(pri)(Auto) name pass
1 aaa 111
2 bbb 222
3 ccc 333
4 aaa 111
5 bbb 222
6 ccc 333
在MySQL数据库中,创建测试表和测试数据,代码如下所示:
create table info(
id int primary key AUTO_INCREMENT,
name varchar(20),
pass varchar(20)
);
insert into info(name,pass)values('aaa','111');
insert into info(name,pass)values('bbb','222');
insert into info(name,pass)values('ccc','222');
1.用一条SQL语句将现有的三条记录复制一下,代码如下所示:
insert into info(name,pass) select name, pass from info;
2.删除重复记录的SQL语句如下所示:
create table tmp as select min(id) as col1 from info group by name,pass;
delete from info where id not in (select col1 from tmp);
drop table tmp;