zoukankan      html  css  js  c++  java
  • 表的进阶操作

    一、存储引擎简介

      通常我们存储不同类型的文件,都会采用不同的格式文件来保存。

      所以,数据库中的数据也应该采取不同的存储格式来存储对应的文件,表的类型不同会对应MySQL不同的存储机制,表类型又称为存储引擎。

      在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

    create table tb(id primary key auto_increment) engine=innodb;
    python指定存储引擎的语法

    二、表的简单操作

    1. 创建表的完整语法和注意事项

      语法:

      create table 表名(

        字段名1 类型[(宽度) 约束条件],

        字段名2 类型[(宽度) 约束条件]);

      注意事项:

      1.同一张表中字段名是不允许重复的

      2.中括号里边的条件不是必须指定的

      3.字段名后边的类型是必须存在的

      4.表中的最后一个字段是不能加逗号的

    2. 查看表结构

    desc 表名;

    创建表的完整语法:
    mysql> create table t(
        -> id int primary key auto_increment,
        -> name varchar(15) not null,
        -> sex varchar(10) not null default 'male'
        -> );
    
    查看表的结构
    mysql> desc t;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(15) | NO   |     | NULL    |                |
    | sex   | varchar(10) | NO   |     | male    |                |
    +-------+-------------+------+-----+---------+----------------+
    创建表的完整语法和查看表的结构

    三、数据类型

    https://www.cnblogs.com/Smart1san/p/9339846.html

    四、表的完整约束性

    1.关键词及作用

    作用:保证数据的完整性和一致性

    关键词:primary key 标识该字段为表的主键,可以唯一的标识记录

        auto_increment 标识该字段的值自动增长,一般是主键,int类型

        foreign key 标识该字段为该表的外键

        not null 标识该字段的值不能为空

        default 标识该字段的默认值

        unique key 标识该字段的值是唯一的

        unsigned 无符号

        zerofill 用零填充

    2.unique

    not null unique 和 primary key 的效果是一致的

    mysql> create table t1(
        -> id int primary key auto_increment);
    mysql> desc t1;
    +-------+---------+------+-----+---------+----------------+
    | Field | Type    | Null | Key | Default | Extra          |
    +-------+---------+------+-----+---------+----------------+
    | id    | int(11) | NO   | PRI | NULL    | auto_increment |
    +-------+---------+------+-----+---------+----------------+
    primary key
    mysql> create table t2(
        -> id int not null unique auto_increment);
    mysql> desc t2;
    +-------+---------+------+-----+---------+----------------+
    | Field | Type    | Null | Key | Default | Extra          |
    +-------+---------+------+-----+---------+----------------+
    | id    | int(11) | NO   | PRI | NULL    | auto_increment |
    +-------+---------+------+-----+---------+----------------+
    not null unique

    3.primary key

    单列主键

    mysql> create table t1(
        ->     id int not null unique,
        ->     name varchar(15) not null unique
        ->     );
    mysql> desc t1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   | PRI | NULL    |       |
    | name  | varchar(15) | NO   | UNI | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    方法一
    mysql> create table t2(
        -> id int primary key auto_increment,
        -> name varchar(15) not null unique
        -> );
    mysql> desc t2;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(15) | NO   | UNI | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    方法二
    在所有的字段名后边单独i定义设置主键
    mysql> create table t3(
        -> id int,
        -> name varchar(15) not null unique,
        -> constraint pk_name primary key(id)
        -> );
    mysql> desc t3;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   | PRI | 0       |       |
    | name  | varchar(15) | NO   | UNI | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    方法三

    多列主键

    mysql> create table t4(
        -> ip varchar(15),
        -> port char(5),
        -> primary key(ip,port)
        -> );
    mysql> desc t4;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | ip    | varchar(15) | NO   | PRI |         |       |
    | port  | char(5)     | NO   | PRI |         |       |
    +-------+-------------+------+-----+---------+-------+
    多列主键的创建

    4.auto_increment

      约束字段为自动增长,被约束的字段必须同时被key约束

    mysql> create table t(
        -> id int primary key auto_increment,
        -> name varchar(15)
        -> );
    
    mysql> desc t;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(15) | YES  |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    
    mysql> select * from t;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | baobao |
    |  2 | haohao |
    |  3 | laolao |
    +----+--------+
    例子

    5.foreign key

    两张表之间关系的查找

      5.1先站在左表的角度去找
    是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)

      5.2再站在右表的角度去找
    是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)

      5.3总结:
    #多对一:
    如果只有步骤1成立,则是左表多对一右表
    如果只有步骤2成立,则是右表多对一左表

    #多对多
    如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系

    #一对一:
    如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可

    五、修改表的操作

    1.修改表名

      alter table 表名 rename 新表名

    2.删除字段

      alter table 表名 drop 字段名

    3.增加字段

      alter table 表名 add 字段 数据类型 [完整性约束条件];

      alter table 表名 add 字段 数据类型 [完整性约束条件] first; # 将该字段移至表的第一列(最前方)

      alter table 表名 add 字段1 数据类型 [完整性约束条件] after 字段2; #将字段1放至在字段2之后

    4.修改字段

      alter table 表名 modify 字段名 数据类型 [完整性约束条件];

      alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件];

      alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件];

    六、复制表

    1.复制表结构+记录(该方法的 key 不会复制:即主键、外键和索引)

      create table 新表名 select * from 旧表名;

    2.只复制表结构

      该方法的 key 也不会跟着一起复制

      create table 新表名 select * from 旧表名 where 1>2;   # 因条件不成立,故而在新的表中查不到任何的记录

      

      该方法的 key 会跟着一起复制过去

      create table 新表名 like 旧表名;

    七、删除表

    drop table 表名;

  • 相关阅读:
    spring事务详解(一)初探讨
    spring事务详解(二)实例
    mysql删除重复数据只保留一条
    jdk1.8源码Synchronized及其实现原理
    jdk1.8源码Thread与Runnable区别
    动态创建类并添加属性赋值
    c# 当代热门技术
    c# 开源框架
    极限并发带来的思考(12306 抢票)
    ASP.NET Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程 (Challenge)
  • 原文地址:https://www.cnblogs.com/Smart1san/p/9353372.html
Copyright © 2011-2022 走看看