zoukankan      html  css  js  c++  java
  • day39 表的完整性约束 存储引擎 外键 表之间的关系 表其他相关操作

    表的完整性约束

    二:not null与default

    create table t1(
        id int primary key auto_increment,
        name varchar(16) not null,
        sex enum('male','female') not null default 'male'
    );
    
    PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录 唯一标识且不为空
    FOREIGN KEY (FK)    标识该字段为该表的外键
    NOT NULL    标识该字段不能为空
    UNIQUE KEY (UK)    标识该字段的值是唯一的
    AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)
    DEFAULT    为该字段设置默认值
    
    UNSIGNED 无符号
    ZEROFILL 使用0填充
    mysql> desc t1;
    +-------+-----------------------+------+-----+---------+----------------+
    | Field | Type                  | Null | Key | Default | Extra          |
    +-------+-----------------------+------+-----+---------+----------------+
    | id    | int(11)               | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(16)           | NO   |     | NULL    |                |
    | sex   | enum('male','female') | NO   |     | male    |                |
    +-------+-----------------------+------+-----+---------+----------------+
    不为空且没有设默认值,传值会报错
    mysql> insert into t1(name) values('egon'),('lxx'),('alex');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> select*from t1;
    +----+------+------+
    | id | name | sex  |
    +----+------+------+
    |  1 | egon | male |
    |  2 | lxx  | male |
    |  3 | alex | male |
    +----+------+------+
    

     三:unique key (索引)约束角度功能  约束指定的字段唯一,传入的值不能重复

     egon命令行笔记

    unique key
    
    #针对单个字段的唯一
    mysql> create database db2;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> use db2;
    Database changed
    mysql> create table t1(
        ->     id int primary key auto_increment,
        ->     name varchar(16) not null,
        ->     sex enum('male','female') not null default 'male'
        -> );
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> desc t1;
    +-------+-----------------------+------+-----+---------+----------------+
    | Field | Type                  | Null | Key | Default | Extra          |
    +-------+-----------------------+------+-----+---------+----------------+
    | id    | int(11)               | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(16)           | NO   |     | NULL    |                |
    | sex   | enum('male','female') | NO   |     | male    |                |
    +-------+-----------------------+------+-----+---------+----------------+
    3 rows in set (0.04 sec)
    
    mysql> insert into t1(name) values('egon'),('lxx'),('alex');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> select*from t1;
    +----+------+------+
    | id | name | sex  |
    +----+------+------+
    |  1 | egon | male |
    |  2 | lxx  | male |
    |  3 | alex | male |
    +----+------+------+
    3 rows in set (0.00 sec)
    
    mysql> create table t2(x int unique);
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table t3(
        ->     x int,
        ->     y varchar(5),
        ->     unique key(x)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> desc t2;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | x     | int(11) | YES  | UNI | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    1 row in set (0.02 sec)
    
    mysql> desc t3;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | x     | int(11)    | YES  | UNI | NULL    |       |
    | y     | varchar(5) | YES  |     | NULL    |       |
    +-------+------------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
    
    mysql> show create table t2;
    +-------+-----------------------------------------------------------------------
    ----------------------------------------+
    | Table | Create Table
                                            |
    +-------+-----------------------------------------------------------------------
    ----------------------------------------+
    | t2    | CREATE TABLE `t2` (
      `x` int(11) DEFAULT NULL,
      UNIQUE KEY `x` (`x`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +-------+-----------------------------------------------------------------------
    ----------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> show create table t3;
    +-------+-----------------------------------------------------------------------
    -----------------------------------------------------------------------+
    | Table | Create Table
                                                                           |
    +-------+-----------------------------------------------------------------------
    -----------------------------------------------------------------------+
    | t3    | CREATE TABLE `t3` (
      `x` int(11) DEFAULT NULL,
      `y` varchar(5) DEFAULT NULL,
      UNIQUE KEY `x` (`x`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +-------+-----------------------------------------------------------------------
    -----------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> create table t4(
        ->     x int,
        ->     y varchar(5),
        ->     constraint uni_x unique key(x)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show create table t4;
    +-------+-----------------------------------------------------------------------
    ---------------------------------------------------------------------------+
    | Table | Create Table
                                                                               |
    +-------+-----------------------------------------------------------------------
    ---------------------------------------------------------------------------+
    | t4    | CREATE TABLE `t4` (
      `x` int(11) DEFAULT NULL,
      `y` varchar(5) DEFAULT NULL,
      UNIQUE KEY `uni_x` (`x`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +-------+-----------------------------------------------------------------------
    ---------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> desc t2;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | x     | int(11) | YES  | UNI | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    1 row in set (0.01 sec)
    
    mysql> insert into t2 values(null);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select*from t2;
    +------+
    | x    |
    +------+
    | NULL |
    +------+
    1 row in set (0.00 sec)
    
    mysql> select*from t2;
    +------+
    | x    |
    +------+
    | NULL |
    +------+
    1 row in set (0.00 sec)
    
    mysql> insert into t2 values(null);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select*from t2;
    +------+
    | x    |
    +------+
    | NULL |
    | NULL |
    +------+
    2 rows in set (0.00 sec)
    
    mysql> insert into t2 values(1);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select*from t2;
    +------+
    | x    |
    +------+
    | NULL |
    | NULL |
    |    1 |
    +------+
    3 rows in set (0.00 sec)
    
    
     unique多列联合起来唯一
    mysql> create table service(
        ->     ip varchar(15),
        ->     port int,
        ->     unique key(ip,port)
        ->     );
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> desc service;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | ip    | varchar(15) | YES  | MUL | NULL    |       |
    | port  | int(11)     | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.02 sec)
    
    mysql> insert into service values('1.1.1.1',3306);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select*from service;
    +---------+------+
    | ip      | port |
    +---------+------+
    | 1.1.1.1 | 3306 |
    +---------+------+
    1 row in set (0.00 sec)
    
    mysql> insert into service values('1.1.1.1',3306);
    ERROR 1062 (23000): Duplicate entry '1.1.1.1-3306' for key 'ip'
    mysql> insert into service values('1.1.1.1',3356);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into service values('1.1.1.2',3306);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select*from service;
    +---------+------+
    | ip      | port |
    +---------+------+
    | 1.1.1.1 | 3306 |
    | 1.1.1.1 | 3356 |
    | 1.1.1.2 | 3306 |
    +---------+------+
    3 rows in set (0.00 sec)
    
    四 primary key  提升搜索效率
    站在约束角度看primary key=not null unique  相当于结合体
    以后但凡建表,必须注意:
    1、必须有且只有一个主键
    2、通常是id字段被设置为主键
    
    create table t5(
        id int primary key auto_increment,
    );
    
    mysql> desc t5;
    +-------+---------+------+-----+---------+----------------+
    | Field | Type    | Null | Key | Default | Extra          |
    +-------+---------+------+-----+---------+----------------+
    | id    | int(11) | NO   | PRI | NULL    | auto_increment |
    +-------+---------+------+-----+---------+----------------+
    1 row in set (0.01 sec)
    
    mysql> insert into t5 values(null);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select*from t5;
    +----+
    | id |
    +----+
    |  1 |
    +----+
    1 row in set (0.00 sec)
    
    mysql> create table t6(x int primary key);
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> desc t6;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | x     | int(11) | NO   | PRI | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    1 row in set (0.03 sec)
    
    mysql> insert into t6 values(null);
    ERROR 1048 (23000): Column 'x' cannot be null
    mysql> insert into t6 values(1);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into t6 values(1);
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    mysql> select*from t6;
    +---+
    | x |
    +---+
    | 1 |
    +---+
    1 row in set (0.00 sec)
    
    
    #不能指定多个主键的情况
    mysql> create table t7(x int primary key,y int primary key);
    ERROR 1068 (42000): Multiple primary key defined
    
    #未指定主键默认自定义主键
    mysql> create table t7(x int,y varchar(5),z int not null unique);
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> desc t7;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | x     | int(11)    | YES  |     | NULL    |       |
    | y     | varchar(5) | YES  |     | NULL    |       |
    | z     | int(11)    | NO   | PRI | NULL    |       |
    +-------+------------+------+-----+---------+-------+
    
    只要是innodb存储引擎一定会要主键
    mysql> create table t8(x int,y varchar(5),z int);
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> create table t9(x int,y varchar(5),z int not null unique,m int not null u
    nique);
    Query OK, 0 rows affected (0.22 sec)
    
    mysql> desc t9;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | x     | int(11)    | YES  |     | NULL    |       |
    | y     | varchar(5) | YES  |     | NULL    |       |
    | z     | int(11)    | NO   | PRI | NULL    |       |
    | m     | int(11)    | NO   | UNI | NULL    |       |
    +-------+------------+------+-----+---------+-------+
    4 rows in set (0.03 sec)
    

    表的存储引擎

    自己处理自己的数据用不同的文件来处理,文件分不同的类型,表也分不同的类型

    表的类型有一个专有的名词,称之为存储引擎,为一个表指定了存储引擎,相当于创建了表的类型

     transaction交易

    rowlevel行级锁

    四:primary key(索引)约束角度的功能

    站在约束角度看primary key=not null unique

    index key(索引)

    目的是为了加速查询用的,不常用

    存储引擎

    五 foreign key:限制关联表某一个字段的值必是来自于被关联表的一个字段的 外键


     foreign key注意:
     1、被关联的字段必须是一个key,通常是id字段
     2、创建表时:必须先建立被关联的表,才能建立关联表
    create table dep(
    id int primary key auto_increment,
    dname varchar(20),
    info varchar(50)
    );

    create table emp(
    id int primary key auto_increment,
    name varchar(15),
    age int,
    dep_id int,
    foreign key(dep_id) references dep(id)
    on update cascade
    on delete cascade
    );

    先先建立被关联的表

    # 3、插入记录时:必须先往被关联的表插入记录,才能往关联表中插入记录
    insert into dep(dname,info) values
    ('IT','技术能力有限部门xxx'),
    ('Sale','文化程度不高'),
    ('HR','招不到人部门');


    insert into emp(name,age,dep_id) values
    ('egon',18,1),
    ('alex',28,2),
    ('wsj',38,2),
    ('lxx',30,1),
    ('xiaohou',18,3);

     egon上课笔记

    先创建被关联的表,再创建关联的表
    mysql> use sb2;
    Database changed
    mysql> create table dep(
        -> id int primary key auto_increment,
        -> dname varchar(20),
        -> info varchar(50)
        -> );
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> create table emp(
        -> id int primary key auto_increment,
        -> name varchar(15),
        -> age int,
        -> dep_id int,
        -> foreign key(dep_id) references dep(id)
        -> on update cascade
        -> on delete cascade
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> desc emp;
    +--------+-------------+------+-----+---------+----------------+
    | Field  | Type        | Null | Key | Default | Extra          |
    +--------+-------------+------+-----+---------+----------------+
    | id     | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name   | varchar(15) | YES  |     | NULL    |                |
    | age    | int(11)     | YES  |     | NULL    |                |
    | dep_id | int(11)     | YES  | MUL | NULL    |                |
    +--------+-------------+------+-----+---------+----------------+
    4 rows in set (0.02 sec)
    
    mysql> desc dep;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | dname | varchar(20) | YES  |     | NULL    |                |
    | info  | varchar(50) | YES  |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    3 rows in set (0.01 sec)
    
    因为外键的功能是限制dep_id的值不能乱写一定是来自于被关联的这张表的值
    
    插入记录时:必须先往被关联的表插入记录,才能往关联表插入记录
    mysql> insert into dep(dname,info) values
        -> ('IT','技术能力有限部门xxx'),
        -> ('Sale','文化程度不高'),
        -> ('HR','招不到人部门');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> insert into emp(name,age,dep_id) values
        -> ('egon',18,1),
        -> ('alex',28,2),
        -> ('wsj',38,2),
        -> ('lxx',30,1),
        -> ('xiaohou',18,3);
    Query OK, 5 rows affected (0.00 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    
    mysql> select*from dep;
    +----+-------+---------------------+
    | id | dname | info                |
    +----+-------+---------------------+
    |  1 | IT    | 技术能力有限部门xxx |
    |  2 | Sale  | 文化程度不高        |
    |  3 | HR    | 招不到人部门        |
    +----+-------+---------------------+
    3 rows in set (0.00 sec)
    
    mysql> select*from emp;
    +----+---------+------+--------+
    | id | name    | age  | dep_id |
    +----+---------+------+--------+
    |  2 | egon    |   18 |      1 |
    |  3 | alex    |   28 |      2 |
    |  4 | wsj     |   38 |      2 |
    |  5 | lxx     |   30 |      1 |
    |  6 | xiaohou |   18 |      3 |
    +----+---------+------+--------+
    5 rows in set (0.00 sec)
    
    mysql> delete from dep where id=2;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select*from dep;
    +----+-------+---------------------+
    | id | dname | info                |
    +----+-------+---------------------+
    |  1 | IT    | 技术能力有限部门xxx |
    |  3 | HR    | 招不到人部门        |
    +----+-------+---------------------+
    2 rows in set (0.00 sec)
    
    mysql> select*from emp;
    +----+---------+------+--------+
    | id | name    | age  | dep_id |
    +----+---------+------+--------+
    |  2 | egon    |   18 |      1 |
    |  5 | lxx     |   30 |      1 |
    |  6 | xiaohou |   18 |      3 |
    +----+---------+------+--------+
    3 rows in set (0.00 sec)
    
    mysql> drop table dep;
    ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constrai
    nt fails
    
    删除时应该先删除关联表,再删除被关联表
    
    mysql> create table dep(
        -> id int primary key auto_incremen
        -> dname varchar(20),
        -> info varchar(50)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> create table emp(
        -> id int primary key auto_incremen
        -> name varchar(15),
        -> age int,
        -> dep_id int,
        -> foreign key(dep_id) references d
        -> on update cascade
        -> on delete cascade
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into dep(dname,info) valu
        -> ('IT','技术能力有限部门xxx'),
        -> ('Sale','文化程度不高'),
        -> ('HR','招不到人部门');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> insert into emp(name,age,dep_id)
        -> ('egon',18,1),
        -> ('alex',28,2),
        -> ('wsj',38,2),
        -> ('lxx',30,1),
        -> ('xiaohou',18,3);
    Query OK, 5 rows affected (0.01 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    
    mysql> select*from dep;
    +----+-------+---------------------+
    | id | dname | info                |
    +----+-------+---------------------+
    |  1 | IT    | 技术能力有限部门xxx |
    |  2 | Sale  | 文化程度不高        |
    |  3 | HR    | 招不到人部门        |
    +----+-------+---------------------+
    3 rows in set (0.00 sec)
    
    mysql> select*from emp;
    +----+---------+------+--------+
    | id | name    | age  | dep_id |
    +----+---------+------+--------+
    |  1 | egon    |   18 |      1 |
    |  2 | alex    |   28 |      2 |
    |  3 | wsj     |   38 |      2 |
    |  4 | lxx     |   30 |      1 |
    |  5 | xiaohou |   18 |      3 |
    +----+---------+------+--------+
    5 rows in set (0.00 sec)
    
    create table t12(x int)engine='myisam';
    create table t13(x int)engine='innodb';
    create table t14(x int)engine='memory';
    create table t15(x int)engine='blackhole';
    
    frm存表的结构
    myd代表的是myisam存储引擎的数据文件
    myi代表的是index的意思存放的是索引
    ibd代表的是又存数据又存索引
    
    客户端不存数据,存的是服务端
    

      

    一对一

    表之间的关系,多对一

     

    表之间的关系,多对多

    找两张表关系的窍门
    emp dep
    1; 先站在左表的角度;去找左表emp的多条记录能否对应对应右表dep的一条记录
    翻译:多个员工能否属于一个部门
    2:然后站在右表的角度;去找右表dep的多条记录能否对应左表emp的一条记录
    翻译:多个部门能否拥有一名员工

    多对一结果的判断
    1、如果只有单向的多对一成立,那么最终的关系就是多对一
    2、在emp表新增一个字段dep_id,该字段外键关联dep(id)

    多对多:结果的判断
    1、双向的多对一就是多对多
    2、需要建立第三张表,又一个字段fk左表,一个字段fk右表

    实战:
    create table author(
    id int primary key auto_increment,
    name varchar(16),
    age int);

    create table book(
    id int primary key auto_increment,
    bname varchar(20),
    price int);

    create table author2book(
    id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(author_id) references author(id) on update cascade on delete cascade,
    foreign key(book_id) references book(id) on update cascade on delete cascade);

    表其他相关操作

    修改表

    语法:
    1. 修改表名
          ALTER TABLE 表名 
                              RENAME 新表名;
    
    2. 增加字段
          ALTER TABLE 表名
                              ADD 字段名  数据类型 [完整性约束条件…],
                              ADD 字段名  数据类型 [完整性约束条件…];
          ALTER TABLE 表名
                              ADD 字段名  数据类型 [完整性约束条件…]  FIRST;
          ALTER TABLE 表名
                              ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;
                                
    3. 删除字段
          ALTER TABLE 表名 
                              DROP 字段名;
    
    4. 修改字段
          ALTER TABLE 表名 
                              MODIFY  字段名 数据类型 [完整性约束条件…];
          ALTER TABLE 表名 
                              CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
          ALTER TABLE 表名 
                              CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
    

    复制表

    G使表有序排列

  • 相关阅读:
    go语言判断末尾不同的长字符串的方法
    Go语言高级特性总结——Struct、Map与JSON之间的转化
    MacOS使用常用配置
    关于联盟链的一种激励扩张思路(原创)
    密码学中经典算法及应用
    无线网络
    基础的并查集
    找单词
    找零钱
    最大子矩阵
  • 原文地址:https://www.cnblogs.com/wangmiaolu/p/9333610.html
Copyright © 2011-2022 走看看