小能MySQL笔记 第七课
建表语句
案例,高端白领私密社交网站
主键id |
用户名 |
性别 |
体重kg |
生日 |
工资 |
上次登录时间 |
个人简介 |
id |
username |
Gender |
Weight |
Birth |
Salary |
Last login |
intro |
列名称 |
列类型 |
默认值 |
是否主键 |
Id |
Int unsigned |
|
PRI |
Username |
Varchar(20)/char(20) |
|
|
Gender |
Char(1)/tinyint |
|
|
Weight |
Tinyint unsigned |
|
|
Birth |
date |
|
|
Salary |
Decimal(8,2) |
|
|
Last login |
Int unsigned |
|
|
Intro |
Varchar(1500) |
|
|
这张表还不够好,还可以优化。
分析:这张表除了username/intro列之外,每一列都是定长的,我们不妨让其所有列,都定长,可极大提高查询速度。空间与和时间是一对矛盾,优化方法,时间换空间,空间换时间。
Username char(20)会造成存储空间的浪费,但是提高了速度,值。
Intro char(1500)却浪费的太多了,另一方面,人的简介,一旦注册完成改的频率也并不高,我们可以把intro列单独拿出来,另放一张表里。
列名称 |
列类型 |
默认值 |
是否主键 |
id |
Int unsigned |
|
PRI |
Username |
char(20) |
|
|
Intro |
varchar(1500) |
|
|
在开发中,会员的信息优化。往往是把频繁用到的信息,优先考虑效率,存放到一张表中,不常用的信息和比较占据空间的信息,优先考虑空间占用,存储到辅表中。
建表语法:所谓建表就是一个声明列的过程。
Create table 表名(
列名1声明 列1参数,
列名2声明 列2参数,
…………
列名N声明 列N参数
)engine myisam/innodb/bdb charset utf8/gbk/latin1;
create table ren(
-> id int unsigned auto_increment primary key,
-> username char(20) not null default '',
-> gender char(1) not null default '',
-> weight tinyint unsigned not null default 0,
-> birth date not null default '0000-00-00',
-> salary decimal(8,2) not null default 0.00,
-> lastlogin int unsigned not null default 0
-> )engine myisam charset utf8;
修改表的语法,一张表创建完毕,有N列,之后可能要增加或删除或修改列
Alter table 表名 add 列名称 列类型 列参数
增加生日列
发现性别列gender忘记加了,现在要求加上,并且要加在username后。
如果想新建一个列,且在表的最前面,用first。
删除列:alter table 表名 drop 列名; // 删除pid列
修改列:修改列类型,到了某世纪,性别发生了变化 男/女/雌雄同体/伪娘,这是我们想把char(1)改为char(4):alter table 表名 modify 列名 新类型 新参数
修改列名及类型: alter table 表名 change 旧列名 新列名 新类型 新参数
将id修改为UID:alter table m1 change id UID int unsigned;
作业:建一个电子商城,如何来设计商品表。再把商场表里的字段,一个个删掉,在一个个加上,并穿插改列操作。
如果列类型改变了,导致数据存不下怎么办?
比如,int改为smallint,如果不匹配,数据将会丢失,或者mysql的strict_mode下,修改不了。