MySQL学习(二)-字段类型及约束

MySQL学习之二

如何选择字段类型

  1. 尽量精确,如身份证号码,使用char(18),不使用varchar(18)
  2. 考虑应用语言的处理;将时间日期保存为整型
  3. 考虑兼容性

列的属性

NULL

  1. 是否为空

    • 规定一个字段的值,是否可以是null
    • NULL/NOT NULL
    • 默认值属性:DEFAULT values, 在没有设置该字段设置值启动,一个字不能为空,可以使用默认值
  2. Example

    -- null/not null
    CREATE TABLE php_1(
        a INT NOT NULL,
        b INT
    );
    
    
    INSERT INTO php_1 (a) VALUES (10);
    
    -- 插入失败,a 没有默认值
    INSERT INTO php_1 (b) VALUES (11);
    
    -- Default values
    CREATE TABLE php_2(
        a INT NOT NULL DEFAULT 10,
        b INT NOT NULL DEFAULT 11
    );
    
    -- 在有默认值的情况下,可以插入单个字段的数值
    INSERT INTO php_2 (a) VALUES (10);
    INSERT INTO php_2 (b) VALUES (11);
    
    
    CREATE TABLE php_3(
        a INT NOT NULL DEFAULT 10,
        b INT DEFAULT 11
    );
    
    -- 如果有默认值,可以插入NULL
    INSERT INTO php_3 VALUES(20, NULL)
    

主键PK

  1. 可以唯一标识,某一记录的字段或者字段的集合,就是主键

    • 单一主键,可以是自身实体的属性,但是最好自身不冲突,不属于实体的任何属性,作为唯一标识,主键和业务逻辑不发生关系

    • 联合主键

    • 主键不能为空,冲突

    • 在定义字段,再定义主键,可以将主键进行组合

    • 组合主键表示一个主键内有多个字段,mysql规定只能有一个主键

  2. 语法

    PRIMARY KEY
    
  3. Example

    -- 主键的定义方式
    CREATE TABLE teacher(
        t_id INT PRIMARY KEY,
        t_name VARCHAR(5),
        class_name VARCHAR(6),
        days TINYINT UNSIGNED
    );
    
    -- 主键不能重复,不能为空
    INSERT INTO teacher VALUES (1, 'Jack', '0331', 25);
    INSERT INTO teacher VALUES (1, 'Kevin', '0331', 25);
    INSERT INTO teacher VALUES (NULL, 'Kevin', '0331', 25);
    
    SELECT * FROM teacher t_id=1;
    
    -- 组合主键
    CREATE TABLE teacher2(
        t_name VARCHAR(5),
        class_name VARCHAR(6),
        days TINYINT UNSIGNED,
        PRIMARY KEY (t_name, class_name)
    );
    

自动增长

1.介绍

主要性质如下:

  • 为每条记录提供唯一的标识,每次插入记录时,将某字段的值自动增加1,使用AUTO_INCREMENT标识

  • 需要整型,还需要索引

  • 插入数据,可以插入null或者不插入

  • 自动增长的初始值,可以设置; 如果n的值,小于已经存在的主键的值,该设置的值不起作用

  • 强制插入自动增长的值,是可以的;如果是主键的,不可以重复插入,如果不是主键,是可以插入的;同时可以更改

  • 问题:自动增长设置为20,数据库已经存在大于20的记录,删除所有大于20的记录,插入数据时, ID为多少?

  1. Example

    -- 自动增长
    
    CREATE TABLE teacher3(
        t_id INT PRIMARY KEY AUTO_INCREMENT,
        t_name VARCHAR(5),
        class_name VARCHAR(6),
        days TINYINT UNSIGNED
    );
    
    INSERT INTO teacher3 VALUES (null, 'emma', '0228', 34);
    INSERT INTO teacher3 (t_name, class_name, days) VALUES ('Jessica', '0231', 31);
    
    ALTER TABLE teacher3 AUTO_INCREMENT 10;
    INSERT INTO teacher3 (t_name, class_name, days) VALUES ('janice', '0231', 31);
    

实体之间的关系

  1. 1:1 对应关系

    两个实体表中,存在相同的主键字段即如果记录的主键值等于另外一个关系表内记录的主键值,则这两条关系是一一对应的

    优化方式:垂直分割的方式,有可能带来数据的冗余

  2. 1:n关系

    一个实体,对应多个其他实体,例如:一个班级对应多个学生

    设计:在多的那端,增加一个字段,用于指向该实体所属的另外实体标识。

  3. M: N关系

如果仅仅增加字段,在编辑的时候,容易比较难操作

设计:增加一个中间表,来表示有关系的两个表之间的关系

实体之间的约束-外键 Foreign Key

  1. 概念

如果一个实体(student)的某个字段(student:class_id),引用另一个实体(class:class_id)的主键(class_id),称作该实体的外键。

被指向的实体,称之为主实体,也叫父实体(父表)。
负责指向的实体,称之为从实体(从表),也叫子实体(子表)。

  1. 作用

用于约束关系内的实体
增加字表记录时,是否有为之对应的父表记录。
在删除或者更新主表记录时,从表应该如何处理相关的记录。

  1. 语法

    -- 在从表上,使用FOREIGN KEY关键字,创建字段,指向主表
    
    SET names gbk;
    
    DROP TABLE IF EXISTS gene_class;
    CREATE TABLE gene_class(
        class_id INT PRIMARY KEY AUTO_INCREMENT,
        class_name VARCHAR(10)  NOT NULL DEFAULT 'itcast_php' COMMENT 'class_name'
    ) CHARACTER SET utf8;
    
    
    DESC gene_class;
    
    DROP TABLE IF EXISTS itcast_student;
    CREATE TABLE itcast_student(
        stu_id INT PRIMARY KEY AUTO_INCREMENT,
        stu_name VARCHAR(10) NOT NULL DEFAULT '', 
        class_id INT, 
        FOREIGN KEY (class_id) REFERENCES gene_class (class_id)
    ) CHARACTER SET utf8;
    
    -- 没有父表记录,就不能创建字表的记录
    INSERT INTO itcast_student VALUES (null, 'Gene', 1);
    
    INSERT INTO gene_class VALUES (null, 'php0331');
    
  2. 修改外键

  • 先删除,再新建,通过修改表完成

    ALTER TABLE tb_name DROP FOREIGN KEY (字段名);
    

    删除外键需要通过指定外键名称达到目的;
    可以通过在创建外键时候,指定名称,
    或者使用mysql默认生成的名称

    ALTER TABLE tb_name ADD FOREIGN KEY 外键定义;
    
  1. 设置级联操作

在主表数据发生改变时候, 与之关联的从表数据应该如何处理

  • 主表更新: ON UPDATE

    • 更新存在关联的主键字段,是不能成功的
  • 主表删除: ON DELETE

  • 允许的级联操作

    • CASCADE 关联操作,如果主表被更新或删除,那么从表也会执行相应的操作
    • SET NULL 设置NULL, 表示从表不指向任何主表记录
    • RESTRICT 拒绝主表的操作
    -- 删除外键
    ALTER TABLE itcast_student DROP FOREIGN KEY itcast_student_ibfk_1;
    
    -- 增加外键,在删除主表的数据时,从表的相关的数据变成NULL
    ALTER TABLE itcast_student ADD FOREIGN KEY (class_id) REFERENCES gene_class (class_id) ON DELETE SET NULL;
    
    DELETE FROM gene_class WHERE class_id=1;
    
    
    -- 删除外键
    INSERT INTO gene_class VALUES (null, 'php0331');
    ALTER TABLE itcast_student DROP FOREIGN KEY itcast_student_ibfk_1;
    
    -- CASCADE 增加外键,在删除主表的数据时,从表的相关的数据也删除
    ALTER TABLE itcast_student ADD FOREIGN KEY (class_id) REFERENCES gene_class (class_id) ON DELETE CASCADE;
    
    DELETE FROM gene_class WHERE class_id=2;
    
    ALTER TABLE itcast_student ADD FOREIGN KEY (class_id) REFERENCES gene_class (class_id) ON DELETE SET NULL ON UPDATE CASCADE;
    
  1. 外键

主要通过程序来控制,不要在数据库中使用,除非你是DBA。

存储引擎

1.简介
表存储的驱动, InnoDB存储引擎支持外键,其他的不支持外键,如BOB
默认的存储引擎, 通过my.ini来控制

可以配置:

```
DEFAULT-STORAGE-ENGINE=INNODB
```

在创建表,或者编辑表时,可以指定表的存储引擎

```
ENGINE 引擎类型
ENGINE myisam;
ENGINE innodb;
```
  1. 区别
    INNODB - 只生成一个文件,数据和索引放在INNODB指定的空间中,frm保存表结构
    myisam - 生成三个文件:frm结构、数据和索引

  2. 选择存储引擎的依据

  • 性能
  • 功能

ORDER BY

  1. 简介

按照字段值进行排序;校对规则,决定排序关系
默认升序 ASC

```
ORDER BY 字段 ASC|DESC;
```

允许多字段排序,指的是,先按照第一个字段排序,如果说,不能区分,再使用第二个字段,还是不行,使用第三个字段

```
SELECT * FROM teacher_class ORDER BY days DESC;
SELECT * FROM teacher_class ORDER BY days DESC, begin_date ORDER BY DESC, end_date ORDER BY DESC;
```

如果分组,应该使用分组字段进行排序:GROUP BY

原文地址:https://www.cnblogs.com/Tcorner/p/9258792.html