mysql:创建表时默认值和主键

列的默认值

  1. null 查询不便
  2. null 的索引效率不高

所以实际中应该避免值为 null,如何避免:
声明列为 not null,并设置默认值 default

create table t10 (
id int not null default 0,
name char(10) not null default ''
)

主键与自增

主键 primary key,能够区分每一行(不重复)

create table t11 (
id int primary key,
name char(2)
)
create table t11 (
id int,
name char(2),
primary key(id)
)

一般我们把自增 auot_increment 加在主键上

create table t11 (
id int primary key auot_increment,
name char(2)
)

综合建表案例

优化原则:

  • 常用与不常用分离
  • 定长与变长分离

例1

create table goods (
  goods_id mediumint(8) unsigned primary key auto_increment,
  goods_name varchar(120) not null default '',
  cat_id smallint(5) unsigned not null default '0',
  brand_id smallint(5) unsigned not null default '0',
  goods_sn char(15) not null default '',
  goods_number smallint(5) unsigned not null default '0',
  shop_price decimal(10,2) unsigned not null default '0.00',
  market_price decimal(10,2) unsigned not null default '0.00',
  click_count int(10) unsigned not null default '0'
) engine=myisam default charset=utf8;

insert into `goods` values (1,'kd876',4,8,'ecs000000',1,1388.00,1665.60,9),
(4,'诺基亚n85原装充电器',8,1,'ecs000004',17,58.00,69.60,0),
(3,'诺基亚原装5800耳机',8,1,'ecs000002',24,68.00,81.60,3),
(5,'索爱原装m2卡读卡器',11,7,'ecs000005',8,20.00,24.00,3),
(6,'胜创kingmax内存卡',11,0,'ecs000006',15,42.00,50.40,0),
(7,'诺基亚n85原装立体声耳机hs-82',8,1,'ecs000007',20,100.00,120.00,0),
(8,'飞利浦9@9v',3,4,'ecs000008',1,399.00,478.79,10),
(9,'诺基亚e66',3,1,'ecs000009',4,2298.00,2757.60,20),
(10,'索爱c702c',3,7,'ecs000010',7,1328.00,1593.60,11),
(11,'索爱c702c',3,7,'ecs000011',1,1300.00,0.00,0),
(12,'摩托罗拉a810',3,2,'ecs000012',8,983.00,1179.60,13),
(13,'诺基亚5320 xpressmusic',3,1,'ecs000013',8,1311.00,1573.20,13),
(14,'诺基亚5800xm',4,1,'ecs000014',1,2625.00,3150.00,6),
(15,'摩托罗拉a810',3,2,'ecs000015',3,788.00,945.60,8),
(16,'恒基伟业g101',2,11,'ecs000016',0,823.33,988.00,3),
(17,'夏新n7',3,5,'ecs000017',1,2300.00,2760.00,2),
(18,'夏新t5',4,5,'ecs000018',1,2878.00,3453.60,0),
(19,'三星sgh-f258',3,6,'ecs000019',12,858.00,1029.60,7),
(20,'三星bc01',3,6,'ecs000020',12,280.00,336.00,14),
(21,'金立 a30',3,10,'ecs000021',40,2000.00,2400.00,4),
(22,'多普达touch hd',3,3,'ecs000022',1,5999.00,7198.80,16),
(23,'诺基亚n96',5,1,'ecs000023',8,3700.00,4440.00,17),
(24,'p806',3,9,'ecs000024',100,2000.00,2400.00,35),
(25,'小灵通/固话50元充值卡',13,0,'ecs000025',2,48.00,57.59,0),
(26,'小灵通/固话20元充值卡',13,0,'ecs000026',2,19.00,22.80,0),
(27,'联通100元充值卡',15,0,'ecs000027',2,95.00,100.00,0),
(28,'联通50元充值卡',15,0,'ecs000028',0,45.00,50.00,0),
(29,'移动100元充值卡',14,0,'ecs000029',0,90.00,0.00,0),
(30,'移动20元充值卡',14,0,'ecs000030',9,18.00,21.00,1),
(31,'摩托罗拉e8 ',3,2,'ecs000031',1,1337.00,1604.39,5),
(32,'诺基亚n85',3,1,'ecs000032',4,3010.00,3612.00,9);

例2

某高端白领社交网站

列名称 列类型 默认值 是否主键
id int unsigned PRI
username varchar(20)
gender char(1)/tinyint/enum(男女)
weight(kg) tinyint unsigned
barth Date
salary decimal(8,2)
lastlogin datetime
info varchar(1500)

优化:
分析:这张表 username/info 是长度可变,影响性能,lastlogin 需要频繁使用,我们用时间戳代替

列名称 列类型 默认值 是否主键
id int unsigned PRI
gender char(1)/tinyint/enum(男女) (问了后端一般用tinyint的01代替
weight(kg) tinyint unsigned
barth Date
salary decimal(8,2)
lastlogin int unsigned

username char(10) 是会造成空间的浪费,但是提高了速度值,但是如果变成 info char(1500) 则浪费太多了,而且简介一旦注册完改的频率不高,我们可以把 info 列单独拿出来放另一张表里。

优化原则:

  • 常用与不常用分离
  • 定长与变长分离
列名称 列类型 默认值 是否主键
id int unsigned PRI
username char(10)
info varchar(1500)

你可能感兴趣的:(数据库)