MySQL不仅可以对表数据操纵,也可以用来执行数据库和表所有操作,包括表本身的创建和处理
一、表的相关概念
1、 表(table):某种特定类型数据的结构化清单。
如果把数据库理解成一个文件柜,那么表可以看成是文件柜中的某一个抽屉 ,存储在表中的数据是一种类型的数据或一个清单,然后根据存储的这一类东西起一个名字来标识,这样就很有调理,方便查找,很nice,但是相同的数据中不要起相同的表名,以为这样就违背了初
模式(schema) : 关于数据库和表的布局及特性的信息。
模式可以用来描述数据库中特定的表以及整个数据库和其中表的信息,如描述表的一些特性,数据如何在表中存储,数据如何分解,各部分信息如何命名等
2、列(column): 表中的一个字段。所有表都是由一个或多个列组成。
数据库中每个列都有相应的数据类型,数据类型定义列可存储数据的种类。
数据类型: 所容许的数据的类型。每个表列都有相应的数据类型,它限制或容许该列中存储的数据(限制和容许描述相同的事感觉有点不一样)
好处:限制类可存储在列中的数据种类,防止录入错误,出现数据混乱
帮助正确的排序数据,优化对磁盘的使用
3、行(row): 表中的一个记录。有的称为数据库记录(record),但是在技术上称为行
表中的数据是按行存储的,所保存的每个记录存储在自己的行内。
若把表看成一个网格,那么垂直的列成为表列,水平的成为表行
二、创建表 (CREATE TABLE)
主要有两种方法:一个通过具有交互式创建和管理表的工具另一个是通过MySQL语句操纵
实际上使用交互式工具创建表时本质上还是使用mysql 语句,只不过这些语句不是用户编写的是界面工具自动生成并执行的
使用create table 创建表时要注意:
1、新表的名字,在关键字 create table 后给出,不要与库中其他表的名字一样,名字要有意义(看见名字要知道干啥用的)
2、所有表的定义都在小括号中
3、表列的名字和定义用逗号分隔 (列名也是),并且在表中是唯一的
4、最后使用分号 ; 结尾
5、在使用sql语句创建表的时候建议格式化一下,就是注意一下缩进,分成多行写,行与行之间分隔一下,这样易于查看和排查错误
-- 创建表 create table tbUser ( user_id int not null auto_increment , user_name varchar(50) not null , user_sex char(10) null , user_address varchar(50) not null default "home" , user_birthdate datetime null , user_remark varchar(255) null , primary key(user_id) )engine = innodb;
如下:红色为关键字,蓝色的为数据库类型,绿色的为符号
括号里面为对字段的设置,最后指定该表的引擎
-- 主要就是 每一列使用 , 分隔,括号前不要有 create table 表名 ( 字段名 数据类型 是否可以为 null );
查看该表的设计
三、表中相关概念
One、NULL值,就是没有值或缺值
作用:允许null值的列在插入行时可以不给出该列的值,不允许null 值的列在插入或更新行时,该列必须有值。
注意:
1、null 为默认行为,主键和重要的列要设置为not null
2、null 值表示没有值,不是空的字符串,空串是一个有效的值,不是无值
Two、主键 (primary key),主键值必须唯一,如果使用多个列,这些列的组合值必须唯一
主键(primary key): 一列(或一组列),其值能够唯一区分表中每个行。
表中每一行都应该有唯一标识自己的一列(或一组列),唯一标识表中每行的这个列(或这组列)称为主键,主键用来表示一个特定的行,方便安全的更新或删除表中特定行。
虽然不总是需要主键,但是每个表要具有一个主键,方便以后的对数据进行操纵和管理。可以作为主键的条件
1、任意两行都不具有相同的主键值。
2、每个行都必须有一个主键值(主键列不允许NULL 值)
3、主键可以是一列也可以是多列,在是引用多列作为主键时,所有列值的组合必须是唯一的(但单个列值可以不是唯一的)
注意:主键的最好习惯
1、不更新主键列中的值
2、不重用主键列的值
3、不在主键列中使用可能会更改的值(一般在sqlserver 中使用不为空的Guid(uniqueidentifier类型) 作为唯一标识,MySQL中使用自增的id 作为主键 )
一般都是用单个列作为主键,定义方式:
-- primary key(列名) primary key(user_id)
如果要使用多个列作为主键
primary key(user_id,user_name)
使用逗号分隔列表中给出的个列名
create table tbUser ( user_id int not null auto_increment , user_name varchar(50) not null , user_sex char(10) null , user_address varchar(50) not null default "home" , user_birthdate datetime null , user_remark varchar(255) null , primary key(user_id,user_name) )engine = innodb;
注意:
1、主键可以在创建时定义也可以在创建表之后定义
2、主键作为唯一标识,必须设置为 not null,一般与 自增长连用
Three、自增长(auto_increment),每增加一行时自动增量
每个表只允许使用一个auto_increment 列,而且必须被索引(通过使它成为主键)
定义:
-- 列名 数据类型 not null auto_increment , user_id int not null auto_increment
注意:
1、如果一个列被指定为auto_increment,他也可以使用特殊的值只要它是唯一的(至今尚未使用过的)就可以,该值会用来替代自动生成的值,后续的增量将开始使用该手工插入的值
2、让mysql 通过自动增量会导致你不知到这些值是谁的,那么如何获取来可以使用last_insert_id() 函数获得这个值
-- 返回最后一个auto_increment 值 select last_insert_id()
four、默认值(default),在没有赋值时使用默认值
定义:
-- 列名 字段类型 default 默认值 ,以下两种方式可以 user_address varchar(50) default "obge" , user_address varchar(50) not null default "home" ,
注意:
1、mysql 不允许使用函数作为默认值,只支持常量,而且指定的值要符合列的类型
2、建议使用默认值而不是null ,特别时对于计算或数据分组的列
five、引擎
DBMS都有一个具体管理和处理数据的内部引擎,在使用create table 语句时,该引擎具体创建表,而在使用select 语句或进行其他数据库处理时,该引擎在内部处理你的请求。多数情况下此引擎都隐藏在DBMS内。
MySQL具有多种引擎,它把打包的多个引擎隐藏在MySQL服务器中,全都可以执行create和select等命令,这些引擎具有各自不同的功能和特性,可以根据不同的任务正确选择不同引擎获得良好的功能和灵活性,要是觉得麻烦也可以忽略这些引擎。
-- 一般在最后定义 engine = 引擎类型; create table 表名 () engine = innodb;
如果省略 engine = 语句,则使用默认引擎(很可能是MYISAM),多数sql 语句会默认使用它,但并不是所有语句都默认使用它,所以 engine = 这个语句很重要。
常见的几种引擎:
1、InnoDB : 一个可靠的事务处理引擎(不支持全文本搜索)
2、MyISAM:一个性能极高的引擎,他支持全文本搜索,但不支持事务处理
3、MEMORY:在功能上等同于MyISAM ,但由于数据存储在内存(不是磁盘)中,速度很快(特别适合于临时表)。
-- 具体文档 https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html
注意:
1、引擎类型可以混用,指的是在同一数据库中
2、外键不能跨引擎,同一个引擎的表不能引用具有使用不同引擎的表的外键。
3、MyISAM 由于其性能和特性可能是最受欢迎的引擎,但是如果需要可靠的事务处理建议使用innodb