表重命名:rename table old_tbl_name tonew_tbl_name; 可以同时针对多个表进行重命名
Rename table srcdb.tablename1 to trgdb.tablename1;
这样源数据库srcdb中的表(表结构和表数据)就被全部迁移到目标数据库trgdb。
更新表结构——列定义管理
l 增加列:Alter table tbl_name addcolumn_definition。可以同时增加多个列,使用括号括起来多个列的定义。
l 删除列:alter table tbl_name dropcolumn_name;
l 修改已有列定义:altertable tbl_name change old_column new_column_definition;或者Altertable tbl_name modify column_definition。其中change可以重命名列
l 修改字符集: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通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。