路在何方,路在脚下!

主键、外键、索引

上一篇 / 下一篇  2012-10-11 20:35:00 / 个人分类:sql相关

对主键,外键,索引的理解:
主键:
1,主键的作用:避免重复,确保数据唯一性
2,如果创建主键之前没有创建索引,那么创建主键时会自动建立对应的唯一索引,当然也可以自己为该column重新创建索引
3,这里涉及到一个概念区别:unique和主键
(1)、Primary key的1个或多个列必须为NOT NULL,如果列为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。而UNIQUE KEY 对列没有此要求。
(2)、一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY。
4,创建主键方式:alter table table_name add primary key(column_name);
create table table_name(column_name char(9) primary key);
5,删除主键方式:alter table table_name drop primary key(key_name);
 

索引:
1,索引的作用:避免每次执行SQL语句而让mysql扫描整个表,需要考虑运用索引,索引文件以树形格式保存。具体使用那几个列创建为索引,
需要根据实际情况。如果表中数据比较少,索引不一定能提高效率,这由查询优化器按照某些规则或估计执行代价来选择
2,索引的种类:
非聚族索引:一个表可以有多个,由于该方式一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间
(因为索引也要随之变动)如果你预计一个表需要频繁地更新数据,那么不要对它建立太多非聚簇索引
聚族索引:一个表只能有一个,占用空间大,相对的,建立的时候消耗也大,但查找大批量数据的时候比较神速
3,这里又涉及到一个概念:创建外键时必须要创建索引,原因在于以下三个方面
(1)主表做删除的影响:主表删除时,会查询所有子表,看是否有引用的数据,如果子表的外键没有索引,
则会发生全表扫描子表,如果子表很多、记录也很多,那么在oracle里则是删除非常慢,在db2里会
发生日志空间满的情况,还有锁定超时等引发911错误等。
(2)主表的主键若做更新,同样会扫描所有子表,如果子表外键没索引,则全表扫描
(3)影响主、从表的join
4,建立索引的方式:
(1)create index index_name on table table_name(column_name1,column_name2);
5,删除索引的方式:
(1)alter table table_name drop index index_name;
 

外键:
1,如果两张表之间存在某种‘约束’,就需要建立外键以保证资料的完整性。在参照表和被参照表中,
相对应的两个字段必须都设置索引(index),前面已经说明了为什么相应表都要创建索引。
2,创建外键方式:
(1)create table table_name(id int foreign key(id) references refer_table(id) on delete restrict on update cascade);
(2)alter table table_name add foreign key(main_table_column_name) references refer_table_name(refer_table_column_name);
3,删除外键方式:ALTER TABLE <表名> DROP CONSTRAINT <外键名>
4,注意点:
(1)两张表必须都是InnoDB表,并且它们没有临时表,查看表类型、外键名等信息的语句:show create table table_name;
(2)建立外键关系的对应列必须具有相似的InnoDB内部数据类型。
(3)建立外键关系的对应列必须建立了索引,查看索引语句:show index from table_name;
总的来说就是,注意新建index(索引),ENGINE = innodb,DEFAULT CHARSET保持一致

TAG: SQL sql sql sql

 

评分:0

我来说两句

Open Toolbar