• 表的完整性约束


    约束条件与数据类型的宽度一样,都是可选参数

    作用:用于保证数据的完整性和一致性
    主要分为:

    PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
    FOREIGN KEY (FK)    标识该字段为该表的外键
    NOT NULL    标识该字段不能为空
    UNIQUE KEY (UK)    标识该字段的值是唯一的
    AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)
    DEFAULT    为该字段设置默认值
    
    UNSIGNED 无符号
    ZEROFILL 使用0填充

    一 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 不为空且唯一 auto_increment标识改字段的值自动增长,目前就是id的自动增长,并未要有primary key主键的情况下才可以设置,
    not null不能为空,不填写就报错;default不输入性别,自动为male, enum 枚举多选一
    insert into t1(name) values('egon'),('lxx'),('alex'); #如果要输入性别就要insert into t1(name,sex) values格式

    二 unique key 

    限制输入字段唯一,设置为联合唯一时,其中有一个不同就没事,如果都相同就报错,联合唯一有一个不同就没事

    create table t2(x int unique);
    create table t3(
        x int,
        y varchar(5),
        unique key(x)
    );
    #效果一样,两种方式一个时在同一行,一个时分开
    create table t4(
        x int,
        y varchar(5),
        constraint uni_x unique key(x)
    );#constraint uni_x将名字改为uni_x

    create table service(
        ip varchar(15),
        port int,
        unique key(ip,port)
    );
    insert into service values
    ('1.1.1.1',3306),
    ('1.1.1.1',3306);#设置为联合唯一时(ip,port)只要ip与port其中有一个不一样就可以输入

    三 primary key 

    站在约束角度看primary key=not null unique
    以后但凡建表,必须注意:
    1、必须有且只有一个主键
    2、通常是id字段被设置为主键

    index key普通索引key加速查询

    如果没有设主键,就在表里面找不为空且唯一的,如果还没找到,就会用隐藏的

    create table t5(
        id int primary key auto_increment
    );#约束功能,不为空,且唯一的默认格式

     

    # 补充存储引擎:
    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';

    Engine代表的是引擎,在创建的表中,frm结尾的是结构,MYD结尾的代表数据文件,MYI代表的是索引,ibd结尾是数据于索引称为索引组织表

    Myusaminnodb是文件存储在服务器内盘上,memory是存储在服务器内存中,blackhole是类似垃圾回收站,一般主要就是用innodb,而用innodb就必须表文件需要有主键

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

    dep是被关联,emp是关联

    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)#关联自己后面的设置id与另一张表的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);

    ps:删除时:

              同步的时候应该删除被关联表emp中的记录,关联表会对应的记录删除

         不同步的时候应该先删除关联表emp中的记录,再删除被关联表对应的记录

     

    修改:

    修改被关联地方

    找两张表关系的窍门:

    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
    );

    一对一:无需参考窍门,左表的一条数据唯一对应右表的一条记录

    拷贝表:

     select * from mysql.user;

     

    Mysql想用横杠与加号拼成表,但是由于字段多,所以乱

    select * from mysql.userG;斜杠大G让他纵向显示

    全部拷贝的话就是create table db1.user select * from mysql.user;#其中记录也在

    只想拷贝表结构的话create table user1 select * from mysql.user where 3<1; 就拷贝了表结构没有记录

    把查询结果往表里丢

     

  • 相关阅读:
    字符串形式导入模块
    pycharm 远程环境开发调试
    ubuntu 18.04 及初始化python3环境
    nbu备份虚拟机
    转载
    linux/centos/rhel同时安装oracle10g和11g
    多进程
    drf笔记
    单例模式
    常用模块
  • 原文地址:https://www.cnblogs.com/yf18767106368/p/9346139.html
Copyright © 2020-2023  润新知