02创建数据库和表
一、创建数据库
-
credate database 数据库名;
-
创建数据库时,可以指定字符集和字符序
命令:create database 数据库名 default character set 字符集名[collate 字符序名];
-
显示数据库结构:show create database 数据库名
-
使用use命令可选定当前数据库:use 数据库名
-
修改数据库的字符集(已经创建好数据库,需要修改字符集):
alter database 数据库名 character set 字符集 collate 字符序;
-
删除数据库:drop database 数据库名
二、命名规范
-
由任意字母、阿拉伯数字、下划线(_)和$组成
-
Windows下不区分大小写、不能使用MySQL关键字、名称最长可达64字符
三、存储引擎
创建表之前,必须明确该表的存储引擎(注意:存储引擎是基于表的,同一个数据库,不同的表,存储引擎可以不同;甚至同一个数据库表,在不同的场合应该应用不同的存储引擎)
-
查看MySQL服务实例支持的存储引擎:show engines
InnoDB存储引擎
特点:
-
支持外键(foreign key)
-
支持事务(Transaction)--增删改查
如果需要执行大量的更新操作,innodb存储引擎是更好的选择
MyISAM
特点:
-
具有检查和修复表的大多数工具
-
表可以被压缩
-
不支持事务
-
不支持外键(foreign key)
如果需要执行大量的select语句,出于性能方面的考虑,MyISAM存储引擎是更好的选择
注意:
-
MySQL 5.6、5.7默认的存储引擎是InnoDB
-
临时地将MySQL当前会话的存储引擎改变命令:
set default_storage_engine=MyISAM;
四、数据类型
整数类型(tinyint、smallint、mediumint、int、bigint)
小数类型
-
decimal(length,precision) 表示精度确定(小数点后数字的位数确定)
-
length:决定了该小数的最大位数;
-
precision:设置精度(小数点后的数字位数)
float、double
字符串类型: 单引号括起来
char与varchar()的区别:定长与变长
-
varchar(255):表示可以存储255个汉字,如果varchar(255)中只包含一个汉字,2个字节,那么varchar(255)中只占用了2个字节的储存空间
-
char(20):不管char(20)中是否存储了20个字节,都按照20字节算
日期类型
-
date:表示日期;默认格式为:YYYY-MM-DD
-
time:表示时间;格式:HH:mm:ss
-
datetime与timestamp是日期和时间的混合类型,格式为:YYYY-MM-DD HH:mm:ss
-
datetime不受时区影响 timestamp受时区影响
-
datetime类型的字段插入null,就是null
-
timestamp类型字段插入null,该字段的值实际上是MySQL服务器当前的日期和时间
-
now():获取mysql服务器的当前时间
复合类型
MySQL支持两种复合数据类型enum枚举类型和set集合类型
-
enum类型:只允许从集合中取得某一个值;一个enum类型的数据最多包含65535个元素
-
set类型:允许从一个集合中取得多个值;一个set类型的数据最多可以包含64个元素
五、创建表
1、语法格式:create table 表名(字段名 数据类型 [列级约束条件], ...[表级约束条件1] ,[表级约束条件2])其他选项(例如存储引擎、字符集等选项)
CREATE TABLE `runoob_tbl`( `runoob_id` INT UNSIGNED AUTO_INCREMENT, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `runoob_id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、创建新表的实质是定义新表的结构,其中有三大要素确定,分别是
-
列名
-
数据类型
-
约束条件
3、指定表的存储引擎:engine = 存储引擎名
指定表的字符集:default charset = 字符集名
六、约束
保证数据库中数据正确性和完整性的约束机制被称为完整性约束
-
约束范围:表级约束、列级约束
-
约束对象:实体完整性、参照完整性、域完整性约束
-
在列定义的约束被称为列级约束
-
在表定义的结尾作为独立约束项的被称为表级约束
-
如果完整性约束涉及到多个属性列时,则必须定义在表级上
七、实体完整性
-
又称行完整性,要求在表中不能存在完全相同的行,而且每行都要具有一个非空又不重复的字段值
-
实体完整性主要依赖于主键约束实现,主键约束使用关键字 primary key
-
primary key 约束用于定义基本表的主键,起唯一标识作用,而且值不能为null
-
如果一个表的主键是单个字段,定义为列级约束
字段名 数据类型 [其他约束条件] primary key
-
定义为表级约束,在定义完所有字段后在定义
primary key (字段名)
-
如果一个表的主键是多个字段的组成,只能定义为表级约束
primary key(字段名1、字段名2)
唯一键(unique)约束
-
唯一性:unique约束用于指明基本表的某一列或多个列的组合上的取值为一
-
唯一键可以为空,最多只有一个初见null值
-
主键自带非空且唯一
-
非主键但是具有唯一值的用unique
-
设置唯一键约束可以定义为列级约束也可以定义为表级约束
列级:字段名 数据类型 [ 其他约束] unique
表级:unique(字段名)
自增型字段
-
自增型字段只能定义为列级约束
-
MySQL自增型字段的值从1开始递增,步长为1
-
语法格式
字段名 数据类型 auto_increment
-
优点:自动编号、速度快、数字型、占用空间小,不用担心主键重复
注意:
-
每张表只能定义一个自增型字段,必须为整数,并且必须定义为主键或唯一键
-
向自增型字段插入一个null或0时,该字段会自动设置为bi上一次插入值更大的值
八、参照完整性
又称引用完整性,指表间的规则,作用于有关联的两个表或两个以上的表,通过主键和外键(或唯一键)之间的关系,使表中的键值在相关表中保持一致(通过foreign key 约束实现)
表A外键字段的取值,要么是null,要么是来自与表B主键字段的取值(此时将表A称为表B的子表,表B称之为表A的父表)
注意:
-
父表的主键和子表的外键必须定义在同一个域上;
-
外键和相应的主键可以不同名
列级约束语法规则:
-
constraint 约束名 foreign key(表A字段名) references 表B (主键字段名) [ on delete 级联选项 ] [on update 级联选项]
级联选项:四个取值
-
cascade:父表记录delete/update操作,会自动delete/update子表记录
-
set null :父表记录delete/update操作,会自动将子表中与之对应的外键值设置为null
-
no action:父表记录delete/update操作,如果子表中存在与之对应的记录,那么delete/update操作失败
-
restrict:与no action 相同,且为级联选项的默认值
九、域完整性
又称列完整性,要求向表中指定列输入的数据必须具有正确的数据类型、格式以及有效的数据范围
域完整性和用户完整性实现的方式有非空约束(not null)、默认值约束(default)、唯一性约束(unique)、检查约束(enum)
-
设置非空约束:字段名 数据类型 [其他约束条件] not null
-
设置默认值约束:字段名 数据类型 [其他约束条件] default 默认值
十、表的管理
-
复制一个表结构:create table 新表名 like 源表;
-
复制一个表的结构和源表的记录:create table 新表名 select * from 源表