zoukankan      html  css  js  c++  java
  • MYSQL——表约束条件,表之间的三种关系

    一、表的约束条件

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

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

    2、主键primary key是innodb存储引擎组织数据的依据,innodb称之为索引(索引是一种树状结构)组织表,一张表中必须有且只有一个主键

      ps: 无 primary key字段 ,无not null+unique
        就会自动生成一个隐藏字段,
        所以建立表的时候要有id字段,不为空且唯一的结构建立主键
    作用:加速查询,表结构,表数据文件

    # not null default
    create table t1(x int not null);
    insert into t1 values();
    
    create table t2(x int not null default 111);
    insert into t2 values();
    
    # unique
    # 单列唯一
    create table t3(name varchar(10) unique);
    insert into t3 values("egon");
    insert into t3 values("tom");
    
    mysql> insert into t3 values("egon");
    ERROR 1062 (23000): Duplicate entry 'egon' for key 'name'
    
    # 联合唯一
    create table server(
        id int,
        name varchar(10),
        ip varchar(15),
        port int,
        unique(ip,port),
        unique(name)
    );
    
    insert into server values (1,"web1","10.10.0.11",8080);
    insert into server values (2,"web2","10.10.0.11",8081);
    mysql> insert into server values(4,"web4","10.10.0.11",8081);
    ERROR 1062 (23000): Duplicate entry '10.10.0.11-8081' for key 'ip'
    mysql>
    
    
    # not null 和unique的化学反应=>会被识别成表的主键
    create table t4(id int,name varchar(10) not null unique);
    create table t5(id int,name varchar(10) unique);
    
    
    # 主键primary key
    # 特点
    #    1、主键的约束效果是not null+unique
    #    2、innodb表有且只有一个主键,但是该主键可以是联合主键
    
    create table t6(
        id int primary key auto_increment,
        name varchar(5)
    );
    
    insert into t6(name) values
    ("egon"),
    ("tom"),
    ("to1"),
    ("to2");
    
    
    # 联合主键(了解)
    create table t7(
        id int,
        name varchar(5),
        primary key(id,name)
    );

    二、表之间的三种关系

      多对一 

      关联方式:foreign key

      多对多

      关联方式:foreign key+一张新的表

      一对一

      关联方式:foreign key+unique

      ps: foreign key 限制表与表之间关系

    # 引入
    # 先创建被关联表
    create table dep(
        id int primary key auto_increment,
        name varchar(6),
        comment varchar(30)
    );
    
    # 再创建关联表
    create table emp(
        id int primary key auto_increment,
        name varchar(10),
        gender varchar(5),
        dep_id int,
        foreign key(dep_id) references dep(id) on delete cascade on update cascade
    );
    
    # 先往被关联表插入数据
    insert into dep(id,name) values
    (1,'技术部'),
    (2,'人力资源部'),
    (3,'销售部');
    
    # 先往关联表插入数据
    insert into emp(name,gender,dep_id) values
    ('egon',"male",1),
    ('alex1',"male",2),
    ('alex2',"male",2),
    ('alex3',"male",2),
    ('李坦克',"male",3),
    ('刘飞机',"male",3),
    ('张火箭',"male",3),
    ('林子弹',"male",3),
    ('加特林',"male",3)
    ;
    
    # 多对一
    # 多对多
    create table author(
        id int primary key auto_increment,
        name varchar(10)
    );
    create table book(
        id int primary key auto_increment,
        name varchar(16)
    );
    create table author2book(
        id int primary key auto_increment,
        author_id int,
        book_id int,
        foreign key(author_id) references author(id) on delete cascade on update cascade,
        foreign key(book_id) references book(id) on delete cascade on update cascade
    );
    
    # 一对一
    create table customer(
        id int primary key auto_increment,
        name varchar(16),
        phone char(11)
    );
    
    create table student(
        id int primary key auto_increment,
        class varchar(10),
        course varchar(16),
        c_id int unique,
        foreign key(c_id) references customer(id) on delete cascade on update cascade
    );

    三、

    ---44---

  • 相关阅读:
    pandas 流式导出excel
    django serializer 定制error_message
    selenium etree xpath使用总结
    Python之路--Python基础
    初见Flask
    Git
    MySQL补充——索引,流程控制,数据备份,python操作mysql,SQLAlchemy
    Python之路--Django--Ajax、同源策略、Jsonp、CORS
    Python之路--Django--form组件与model form组件
    Python之路--Django--中间件
  • 原文地址:https://www.cnblogs.com/guojieying/p/13603888.html
Copyright © 2011-2022 走看看