mysql阅读笔记五

来源:互联网 发布:java核心教程 编辑:程序博客网 时间:2024/05/01 13:56

表重命名:rename table old_tbl_name tonew_tbl_name; 可以同时针对多个表进行重命名

Rename table srcdb.tablename1 to trgdb.tablename1;

这样源数据库srcdb中的表(表结构和表数据)就被全部迁移到目标数据库trgdb。

更新表结构——列定义管理

增加列:Alter table tbl_name addcolumn_definition。可以同时增加多个列,使用括号括起来多个列的定义。

删除列:alter table tbl_name dropcolumn_name;

修改已有列定义:altertable tbl_name change old_column new_column_definition;或者Altertable tbl_name modify column_definition。其中change可以重命名列

修改字符集:alter table tb_name characterset gbk;

 

主关键字(primarykey)是表中的一个或多个字段,它的值用于惟一地标识表中的某一条记录。主键可以是真真实实的属性,但是,常用的解决方案是:利用一个与实体信息不相关的属性,作为唯一标识,主键与业务逻辑不发生关系,只用来标志记录。

删除主键 alter table tbl_name drop primary key;

 

外键(FK,foreignkey):如果一个A表的字段指向另一个B表的主键,则此字段就为A表的外键。用于表示表之间的关系。

作用:保持数据一致性,完整性,主要目的是控制存储在外键表(从表)中的数据。

MySQL中,可以对InnoDB引擎使用外键约束:

ForeignKey (外键字段) references 主表名 (关联字段) [主表记录删除时的动作][主表记录更新时的动作]

create table temp(

  id int,

  namechar(20),

foreign key(id)references outTable(id) on delete cascade on update cascade);

此时需要检测一个从表的外键需要约束为主表的已存在的值。外键在没有关联的情况下,可以设置为null.前提是该外键列,没有notnull。

可以不指定主表记录更改或更新时的动作,那么此时主表的操作被拒绝。

如果指定了onupdate或on delete:在删除或更新时,有如下几个操作可以选择:

1,cascade,级联操作。主表数据被更新(主键值更新),从表也被更新(外键值更新)。主表记录被删除,从表相关记录也被删除。

2,setnull,设置为null。主表数据被更新(主键值更新),从表的外键被设置为null。主表记录被删除,从表相关记录外键被设置成null。但注意,要求该外键列,没有notnull属性约束。

3,restrict,拒绝父表删除和更新。

注意,外键只被innodb存储引擎所支持。其他引擎是不支持的。


 

范式(NF,NormalForm),数据库设计范式,指的是我们设计的关系型数据库需要满足某种级别要求。就是设计关系时的一些规则和要求。

1NF,是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。

2NF,在满足1NF的基础上,要求表中的每条记录必须被唯一的区分。

同时要求,实体属性应该完全依赖于主关键字。而不能是对主关键字形成部分函数依赖。

因此常用的做法,是为每一条记录一个字段用于表示其主键,就是单关键字主键。这样就没有组合主键,也就没有部分依赖了。

3NF,满足第二范式的基础上,要求不能出现传递依赖,也就是不能出现属性依赖于非主属性的.

上面的教室就依赖于班级,而班级依赖于主键ID。就是传递依赖。应该将传递依赖的数据单独建立二维表,保存数据,主要问题,就是数据冗余。

 

Having字句:负责在结果中进行再次过滤。

where负责先获得结果,而如果需要在结果中再次处理(例如通过结果统计出来的聚合结果),则不能再使用where,此时where已经执行完毕,因此此时SQL提供给应该使用having再次执行过滤操作。

SELECTINTO…OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA…INFILE语句恢复数据。但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复原来的表的结构。注意,不允许向已经存在的文件内导出数据

SELECT INTO…OUTFILE语法:
select * from Table into outfile '/路径/文件名'
fields terminated by ','
enclosed by '"'
lines terminated by '\r\n'

TERMINATED BY用来指定字段值之间的符号,例如,“TERMINATED BY','”指定了逗号作为两个字段值之间的标志。

(2)ENCLOSED BY子句用来指定包裹文件中字符值的符号,例如,“ENCLOSED BY '" '”表示文件中字符值放在双引号之间,若加上关键字OPTIONALLY表示所有的值都放在双引号之间。

(3)ESCAPED BY子句用来指定转义字符,例如,“ESCAPED BY '*'”将“*”指定为转义字符,取代“\”,如空格将表示为“*N”。

 LINES子句:在LINES子句中使用TERMINATED BY指定一行结束的标志,如“LINESTERMINATED BY '?'”表示一行以“?”作为结束标志。

 

LOAD DATA local  INFILE 'file_name.txt'   [REPLACE | IGNORE]    INTO TABLEtbl_name   

[FIELDS        [TERMINATEDBY 'string']        [[OPTIONALLY]ENCLOSED BY 'char']        [ESCAPEDBY 'char' ]    ]   

[LINES        [STARTING BY 'string']       [TERMINATED BY 'string']    ]   

[IGNORE number LINES]

local 关键字使客户程序读取文件数据并发送到服务器以加载,如果省略关键字local就表示数据文件是保存在服务器上的,而你必须拥有相应的file服务器访问权限才能把文件里的数据加载数据表里去,但是,大多数mysql用户没有这种权限。

加载数据:

%mysqlimport --local sampdb member.txt  

mysqlimport程序将生成一条能够把member.txt文件里的数据值加载到member表的load data语句,由于mysqlimport程序是根据数据文件的名字来确定与之对应的数据表的,她将把文件名第一个句号字符(.)之前的那个字符串用作表名,所以必须慎重选择数据文件名。

member1.txt 和 member2.txt 会加载到两个数据表member1 和member2表而非一个member表

在导入数据时,如果出现主键冲突,可选的:忽略 或替换。

Load data infile ‘file’ Ignore replace

可以选择在文本文件开始出,忽略若干行再进行导入。

Into table tbl_name ignore N lines;

1,truncate 是删除表再创建,delete 是逐条删除

2,truncate 重置auto_increment的值。而delete不会

3,truncate不知道删除了几条,而delete知道。

truncate table name

使用truncate table删除了指定表中的所有行,但表的结构及其列,约束,索引等保持不变,而新行标识所用的计数值重置为该列的初始值。如果想保留标识计数值,则要使用DELETE语句。

TRUNCATE TABLE执行速度比DELETE快,且使用的系统和事务日志资源少。DELETE语句每次删除一行,并在事务日志中为所删除的每行记录一项。而TRUNCATE TABLE通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。




0 0
原创粉丝点击