zoukankan      html  css  js  c++  java
  • python笔记-mysql约束条件与表关系

    一、约束条件

    约束类型 关键字
    默认约束 default '值'
    非空约束 not null
    唯一约束 unique key
    自增长约束 auto_increment
    主键约束 primary key
    外键约束 foreign key

    1.1 默认约束(default '默认值')

    初始值设置,插入记录时,如果没有明确为字段赋值,则自动赋予默认值

    create table `tb_name`(
    `field_name` data_type default "default_value",...
    );
    

    1.2 非空约束(not null)

    插入数据时, 非空约束字段必须插入值

    create table `tb_name`(
    `field_name` data_type not null,...
    );
    

    1.3 唯一约束(unique key)

    create table `tb_name`(
    `field_name` data_type unique key,...
    );
    

    1.4 自增长约束(auto_increment)

    create table tb_name(
    field_name data_type auto_increment,...
    );
    -- 一张表中只有一个字段自增长。非空且唯一的字段才可以添加自增长约束,
    

    1.5 主键约束(primary key)

    create table tb_name(
    field_name data_type primary key,...
    );  -- 主键要求 非空且唯一。
    
    -- 联合主键
    create table `tb_name`(
        `field_name1` data_type,
        `field_name2` data_type,
        primary key(field_name_1, field_name_2)
    )
    

    1.6 外键约束(foreign key (当前表的字段) references 参照表表名(被参照字段))

    1. 保持数据的一致性、完整性,实现一对一或一对多关系。
    2. 外键必须关联到键上面去,一般情况是,关联到另一张表的主键。
    3. 因为一个表只在一类信息。用外键来做参照,保证数据的一致性,可以减少数据冗余。
    create table `tb_name`(
    `field_name1` data_type,
    `field_name2` data_type,
    constraint AB_id foreign key (当前表的字段) references 参照表表名(被参照字段)
    );  
    -- 1. 通过(当前表的字段)关联到(参照表被参照字段)中,然后,可以重新命名为 AB_id(其中constraint AB_id 可不写)
    -- 2. 外键约束定义,当前表表中的字段,只能添加参照表参照字段中已有的数据。
    -- 3. 参照表中的被参照字段的数据,不能被修改和删除。  
    -- (在当前表中有的数据,被参照表不能修改和删除, 想要删除要先把当前表中的删除,才能删除参照表被参照字段的数据)
    

    二、表关系

    表关系有三种

    • 一对一
    • 一对多
    • 多对多

    下面就学生系统数据库设计表为例

    2.1 一对一

    • 用外键的方式,把两个主键关联
    • 举例,学生表中有学号、姓名、学院,但学生还有写比如电话,家庭地址等信息,这些信息不会放在学生表中,会新建一个学生的详细信息表来储存。
    • 这时的学生表和学生的详细信息两者的关系就是一对一的关系,因为一个学生只有一条详细信息,用主键加主键的方式来实现这种关系
    -- 建立学生表
    create table student(
        id int primary key auto_increment,
        name varchar(20) not null
    );
    
    -- 建立详细学生表
    create table student_details(
        id_x int primary key,
        sex varchar(20) not null,
        age int,
        height int,
        foreign key(id_x) references student(id)  -- 通过外键将字段id_x关联到student表的id字段
    );
    -- 说明:学生表和学生详情表通过student.id  和student_deatails.id_x关联,形成一对一关系,只能插入主键相同的数据
    

    2.2 一对多

    • 通常情况下,学校中一个学院可以有很多学生,而一个学生只属于某一个学院
    • 学院与学生之间的关系就是一对多的关系,通过**外键关联**来实现这种关系
    -- 创建学院表
    create table college(
        id int primary key,
        subjects varchar(10) not null
    );
    
    #创建学院的学生表                                 
    create table vip(
        id_v int primary key auto_increment,         -- 学生的id
        name_v varchar(10) not null,    		 -- 学生名字
        id_w int not null,              		 -- 所属学院id,只能添加已有的学院id
        foreign key(id_w) references college(id)     -- 外键
    );
    

    2.3 多对多

    • 举例,学生要报名选修课,一个学生可以报名多门课程,一门课程有很多学生报名,那么学生表和课程表两者就形成了多对多关系
    • 对于多对多关系,需要创建中间表实现
    -- 课程表, 课程是属于学院的, 所以用外键关联到学院表
    create table course(
    	id int primary key auto_increment,
    	name_c varchar(10),
    	id_c int not null,
    	foreign key(id_c) references college(id)
    );
    
    -- 创建选课表(中间表), 一个字段用外联关联到学生表, 一个关联到课程表
    create table choose(
    	id_stu int,
    	id_cor int,
    	primary key(id_stu,id_cor),   		#联合主键
    	foreign key(id_stu) references vip(id_v),   #关联到学生表的id_v字段
    	foreign key(id_cor) references course(id)     #关联到课程表的id字段
    );
    
  • 相关阅读:
    NX二次开发-NXOpen中Point3d类型转换成point类型
    NX二次开发-char*转换成CString,多字节转换成Unicode使用方法
    NX二次开发-UFUN和NXOpen结合开发中Tag_t对象与TaggedObject对象转换方法
    NX二次开发-算法篇-vector函数排序(例子:遍历所有点并排序)
    NX二次开发-算法篇-冒泡排序(例子:遍历所有点并排序)
    NX二次开发-算法篇-创建最大边界包容盒
    NX二次开发-算法篇-判断找到两个数组里不相同的对象
    NX二次开发-算法篇-随便找个不规则的体,找出面的中心点的Z坐标最高和最低的面,高亮显示
    NX二次开发-C语言文件读写fwrite和fread函数
    NX二次开发-NX+VS写代码设断点调试技巧
  • 原文地址:https://www.cnblogs.com/duyupeng/p/13188369.html
Copyright © 2011-2022 走看看