zoukankan      html  css  js  c++  java
  • 约束

    约束
    什么是约束
    除了数据类型以外额外添加的约束
    为什么要使用约束
    为了保证数据的合法性 完整性

    分类:
    not null  非空约束  数据不能为空
    create table student (id ind,name char(10) not null);

    default 默认值约束 可以指定字段的默认值
    create table user (id ind,name char(10) not null,sex char(1) default "woman");

    unique 唯一性约束 该字段的值不能重复
    unique其实是一种索引: 索引是一种数据结构 用于提高查询效率
    可以为空
    一张表中可以有多个唯一约束
    单列唯一约束
    create table t5(idcard char(18) unique);
    多列联合唯一约束
    create table t6(idcard char(18),phonenumber char(11),unique(idcard,phonenumber));
    意思: 身份证相同 并且 手机号相同 那就叫相同

    primary key
    称之为主键约束
    用于唯一标识表中一条记录
    如何能做到唯一标识 该字段 只要是惟一的 并且不为空 即可
    也就是说 从约束的角度来看主键约束 和 非空 加 唯一约束 没有区别
    那它们之间的区别是什么?
    唯一约束 是一种索引 必然存在硬盘上的某个文件中 是物理层面(实实在在存在的数据)
    primary key 是一种逻辑意义上的数据 (实际上不存在)
    换句话说 主键 就是由 唯一约束 和非空约束 组成的约束
    语法:
    create table stu (stuid int primary key,name char(3));
    create table t7(id int unique not null,name char(3));

    有主键 和没有主键的区别?
    1.无法区分两个相同记录 比如班级里有两个人名字相同
    2.有主键则意味有这索引 效率更高
    3.可以建立关联关系
    多列联合主键:
    create table t8(idcard char(18),phonenumber char(11),primary key(idcard,phonenumber));
    每个表都应该有主键 哪怕不用唯一标识 也应该考虑提升效率, 主键的字段名 几乎都叫id
    同一个表中可以不可以有多个主键 , 主键的类型需要设置为整型

    auto_increment 自动增长
    作用 通常搭配主键字段使用 可以自动为你的数据分配主键
    添加一条就自动加1 计数从1开始
    语法:
    create table t9(id int primary key auto_increment,name char(3));
    如果主键是自动增长 你可以跳过这个字段 也可以为它插入null 都可以
    修改自动增长的起始位置 **
    alter table t9 auto_increment = 7;
    注意: 自动增长 只能用于整型

    分表的原因:
    1.数据冗余
    2.效率低下
    3.扩展性差

    foreign key 专门用于为表和表之间 建立物理关联
    两个表之间能产生的关系
    1.多对一
    2.一对一
    3.多对多
    语法:
    先创建部门表
    create table dept(id int primary key auto_increment,name char(10),manager char(10));
    在创建员工表
    create table emp(id int primary key auto_increment,name char(10),dept_id int,foreign key(dept_id) references dept(id));
    添加外键约束时产生的限制:
    被关联的表(主表)需要先被创建
    在主表的数据删除前 要保证从表关联该数据的数据都删除了
    在更新主表主键前 要先保证从表没有关联到该主键
    简单的说 外键指的是 另一张的主键
    外键加上以后 主表中的数据 删除 和更新时 都受到限制
    解决的方案是为 外键 添加 级联操作
    级联操作
    指的是就是同步更新和删除
    语法:在创建外键时 在后面添加 on update cascade 同步更新
    on delete cascade 同步删除
    实例:
    create table class(id int primary key auto_increment,name char(10));
    create table student(
    id int primary key auto_increment,
    name char(10),
    c_id int,
    foreign key(c_id) references class(id)
    on update cascade
    on delete cascade
    );

    对主表的id进行更新
    以及删除某条主表记录 来验证效果
    多对多关系的处理:
    建立一个第三方表 专门存储两个表之间的关系
    这个关系表 应该有两个字段 分别关联学生的id 和老师的id
    为了保证 数据的合法性 完整性 给这两个字段都添加外键约束
    实例:
    create table teacher (id int primary key auto_increment,name char(10));
    create table student (id int primary key auto_increment,name char(10));
    create table t_s (t_id int,
    s_id int,
    foreign key(t_id) references teacher(id),
    foreign key(s_id) references student(id)
    );
           为了避免重复无用的关系数据  关系表加上关联的主键约束
    create table t_s (t_id int,
    s_id int,
    foreign key(t_id) references teacher(id),
    foreign key(s_id) references student(id),
    primary key(t_id,s_id)
    );
    insert into student value(null,"lxx");
    insert into teacher value(null,"exx");
    insert into t_s value(1,1);
  • 相关阅读:
    窗口吸附
    c++中冒号和双冒号的用法
    C++Builder中注册表的操作
    C++ Builder VCL库函数简介
    C++ Builder 2007中应用数据库SQLite(转载)
    如何使用C++获取 进程的 绝对路径
    正则表达式入门
    为什么要用 C# 来作为您的首选编程语言
    CSharp交换函数swap的三种实现方法
    告别码农,成为真正的程序员
  • 原文地址:https://www.cnblogs.com/liangchengyang/p/9640953.html
Copyright © 2011-2022 走看看