Mysql 明月三千里 (二)

文本类型存储

引擎和数据表文件:

            数据库保存在 /var/lib/mysql/ 目录中。

            每当创建一个数据库时, 会自动在  /var/lib/mysql/ 目录中 产生 同名的 目录。如:create database db2 ——> /var/lib/mysql/db2/

                    创建数据库时,如果没有指定数据库引擎,它选择默认引擎 —— innodb

            在数据库中创建表:

                    innodb引擎:

                                    表名.frm: 表的架构

                                    表名.ibd:  表数据的 索引

                                    对于该引擎,表数据是存放在 ../ibdata1 文件中,随着表个数、数据的增加,文件会自动增多: ibdata1、ibdata2、ibdata3.。。。

                    myisam引擎:

                                    表名.frm: 表的架构

                                    表名.MYD: 表数据

                                    表名.MYI:  表数据索引

字符集:

        在一次客户端访问MySQL数据库,执行语句过程中,至少保证 4 处 字符集一致:

                    1. 客户端选用的字符集。——> 影响 MySQL 客户端使用的字符集。 查看Linux系统字符集:echo 命令查看: echo 2

                    2. 客户端连接服务器时采用的字符集。

                    3. 数据库创建时采用的字符集。

                    4. 数据库返回结果时选用的字符集。

        查看当前MySQL数据库字符集相关:

                    show variables like 'char%';

        使用 set  names  字符集。 一次性设置 character_set_client 、character_set_database、character_set_results

        使用 set character_set_server = utf8 。 临时设置 字符集。 数据库登录退出,即失效。持久化生效修改配置文件: /etc/mysql/mysql.conf.d/mysqld.cnf

环境变量:

            终端下,使用 env 可以查看所有环境变量列表。_ Linux

            echo $PATH (key=value:value:value...)

            echo $LANG

            echo $HOME

            每个进程,内部存储着当前进程自己的环境变量。

数值类型:

                                                有符号                 无符号数(unsigned)

                            tinyint : 1 字节 -2^7~2^7-1          0~2^8-1

                            smallint: 2 字节 -2^15 ~ 2^15-1     0~2^16-1

                            mediumint:3字节

                            int 4 字节

                            bigint 8 字节

                            数值类型使用时,可以指定显示宽度。—— 默认显示的位数 。id  int(5)

                                        如果想在结果集中查看的到:创建表时,指定 zerofill 。 id  int(5)zerofill

                            数值类型使用时,数据类型决定取值范围。 insert  12345567 【正确】

浮点型:

                float  单精度 4字节: -3.4E+38~3.4E+38

                double 双精度 8字节: -1.8E+308~1.8E+308

                声明语法:

                            float (总长度, 小数部分长度) double (总长度, 小数部分长度)

                                            float(5, 3) double(5, 3)

                                            create table t4(num1 float(5,3), num2 double(7, 3));

                            小数部分长度:如果超出(精度超出)。 进行 四舍五入。 insert  23.3467 ——> 23.347 、 insert  23.3461 ——> 23.346

                            整数部分长度超出:errror 报错。 insert  2345.3467  ——>ERROR 1264 (22003): Out of range value for

            对于浮点数来说,允许在存储精度较高的数据时,有数据精度损失。

定点数据:

            decimal 没有存储上限。

            语法:decimal(总长度, 小数部分长度)

                        create table t6 ( num decimal(20,19));

            存储本质:将小数部分、整数部分 分开存储以达到 没有精度损失的目的。但,会消耗存储空间。

字符类型:

            定长字符串: char 255 使用时,指定的是 字符 数

                                指定 字符串长度上限,实际存储是,不会回收剩余空间。  效率高,浪费空间

            变长字符串: varchar 65535 使用时,指定的字符数受限制:

                                    指定 字符串长度上限,实际存储是,会回收剩余空间。效率低,节省空间

                                    1. 受 表所选用的 字符集限制。 utf8: 1个字符 —— 3字节。 gbk :1字符 —— 2字节。

                                    2. 受 一条记录的长度不能超过  65535.

                字符文本:

                                    tinytext:

                                    text:

                                   mediumtext:

                                   longtext:

                                   字符文本类型在实际存储数据时,不直接存数据内容,而存储的是指向数据内容的索引。大约占用 10 字节左右空间。

                                   不会打破 一条记录不允许超出 65535

            枚举类型:

                                   语法: 字段名 enum(枚举值1, 枚举值2, 枚举值3 。。。)

                                   每一个枚举值,对应一个数字,从 1 开始计数。

                                   使用枚举的优点:

                                               1)运算速度快

                                               2)节省空间

                                               3)限定了用户输入,保证数据完整性。

            集合类型:

                                   语法:  字段名 set(列举值1, 列举值2, 列举值3 。。。)

                                   每一个列举值,对应一个数字,从 2^0 开始计数。  依次: 2^0, 2^1, 2^2 ....

                                   使用集合的优点:

                                                   同上。

                                                   insert into t12 values(1, '烫头,抽烟,刷手机'); 【正确】

                                                   insert into t12 values(1, '烫头', '抽烟', '刷手机'); 【错误】

            日期和时间:

                        datetime:  年-月-日 时:分:秒

                                   年: 1-9999

                                   月: 1-12

                                   日:1-31

                                   MySQL系统会自动帮助运算 、年(闰年)、月(不能超出12), 日。

                        date: 年-月-日

                        timestamp:时间戳。 采用绝对计时方式。  从 1970-1-1 00:00:00  ~  2038年01月19日11:14:07  取值范围。

                        time:      时:分:秒  取值范围: -838:59:59 ~ 838:59:59

                                            时:可以超过 24, 分、秒不允许超过 60

            布尔类型:Boolean:

                                   true —— 1

                                   false —— 0

列属性:

            空: nulll

            非空: not null

            默认值: default。

                                   显示插入默认值: 对应域插入数据时,写入 default

                                   隐式插入默认值: 对应域不插入数据。

            自动增长:auto_increment

                                   创建表时,指定字段具备自动增长属性:

                                   create table表名(

                                         id int(9) auto_increment primary key,

                                         name char(10)

                                   );

                                   修改表,添加字段自动增长属性:

                                   1) 创建一个不具备自动增长的表。

                                   create table 表名(

                                         id int(9) primary key,

                                         name char(10)

                                   );

                                   2) 给表的 id 列添加自动增长 属性:

                                   alter table  表名 change  旧字段名 新字段名 数据类型 auto_increment primary key

                                   自动增长列的特性:

                                                   1) 字段从 1 开始,每次递增 1。 保证数据不重复。

                                                   2) 自动增长列必须是 数值类型。

                                                   3) 自动增长列必须是 主键。 (反之,主键不一定自动增长)

                                                   4) 可以使用 null 显示插入 自动增长值。

                                                   5) 删除的 自动增长值,不会重复使用。

            主键: primary key

                                   创建主键,方法1:

                                   create table 表名(

                                        id int(9) primary key,

                                         name char(10)

                                   );

                                   创建主键,方法1:

                                   create table 表名(

                                         id int(9),

                                         name char(10), # 较上一种方法,多添加一个‘,’

                                         primary key(id)

                                   );

                                   创建组合主键:

                                   create table 表名(

                                         id int(9),

                                         num tinyint,

                                         name char(10),

                                         primary key(id, num) # 借助id、num 两个域,创建一个主键。

                                   );

                                   修改表,添加主键, 方法1:

                                   1) 创建一个不具备主键的表。

                                               create table 表名(

                                                        id int(9),

                                                       name char(10)

                                               );

                                   2) 给表的 id 列添加主键:

                                                   alter table  表名 change  旧字段名 新字段名 数据类型 primary key

                                   修改表,添加主键, 方法2:

                                                   alter table 表名 add primary key(id);

                                   删除主键:

                                                   alter table 表名 drop primary key(id);

        总结:

                                   主键特性:

                                               1) 非空、唯一。

                                               2) 一张表只有一个主键。

                                   主键的作用:

                                               1) 保证数据完整性

                                               2) 加快查询速度。

                                   主键选择的原则:

                                               1) 选择 一个字段做主键

                                               2) 选择 修改较少的字段做主键

                                   3) 选择 数值类型做主键。

        唯一键: unique

                    创建唯一键, 方法1:

                                   create table 表名(

                                           id int(9),

                                           name char(10) unique

                                   );

                                   创建唯一键, 方法2:

                                               create table 表名(

                                                       id int(9),

                                                       name char(10) ,

                                                 unique(name)

                                               );

                                   创建组合唯一键,指定 键名:

                                                   create table t23(

                                                  id int,

                                                  name varchar(10),

                                                  email varchar(10),

                                                  unique `UQ_nameEmail` (name, email)

                                                  );

                                   修改表属性,添加唯一:

                                               alter table 表名 add  unique(字段)。

                                   查看唯一键:

                                               show create table  表名\G  获取到唯一键的 键名

                                   删除唯一键:

                                               alter table 表名 drop index 唯一键的 键名;

                                   唯一键特性:

                                               1. 不允许重复。但是可以为空。

                                               2. 一张表,可以有 多个唯一键。

        注释:

                                   单行:

                                               #:

                                               -- : -- 后要添加一个 “空格” 在添加注释内容。

                                   多行:

                                               /* xxxx */

                                   create table t24(

                                   id int, #这是单行注释

                                   name varchar(10) -- 这也是单行注释

                                   /*

                                   这是

                                   多行

                                   注释

                                   */

                                   );


外键约束

数据完整性:

            实体完整性、域完整性、引用完整性:

           实体完整性缺失: 造成数据有歧义。

                      解决方法: 1) 添加主键 2)添加唯一键 3) 添加自动增长列。

           域完整性缺失: 造成数据有歧义。

                      解决方法: 1) 数据类型约束 2)非空约束 3) 默认值。

           外键约束:

1. 主表中没有的从表中不允许插入

2. 从表中有的,主表中不允许删除

3. 不能更改主表中的值而导致从表中的记录孤立存在。

4. 先删除从表,再删除主表

外键约束,创建方法:

                      语法: foreign key (从表的主键名)  references 主表名 (主表的主键名)

                创建主表:

                      create table stuinfo(

                      stuno char(4) PRIMARY KEY,

                      name VARCHAR(10) not null

                      );

               创建从表:

                      create table stuinfo(

                      stuid char(4) PRIMARY KEY,

                      score int(10) not null,

                      foreign key (stuid)  references stuinfo (stuno )

                      );

外键约束,修改表添加方法:

                                 alter table 从表名  add foreign key (从表的主键名)  references 主表名 (主表的主键名);

                                 查看外键约束:

                                            show craete table 从表名\G —— 外键名。

                                 删除外键约束:

                                            alter table 从表名 drop foreign key 外键名;

                                 级联操作:

                                            一般来说:主表删除的时候,从表置空(null)操作,主表更新的时候,从表级联(cascade)操作。

                                            foreign key (stuno) references stuinfo(stuno) on delete set null on update cascade

                                   

                                   

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容