zoukankan      html  css  js  c++  java
  • 数据库表的约束

    一、数据库约束的概述

      1、约束的作用

        对表中的数据进行限制,保证数据的正确性、有效性和完整性。

        一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。

      2、约束的种类

    约束名 约束关键字
    主键约束 primary key
    唯一约束 unique
    非空约束 not null
    外键约束 foreign key
    检查约束 check 注:MySQL不支持

    二、主键约束

      1、主键的作用

        主键的作用:用来唯一标识数据库中的每一条记录。

      2、哪些字段应该作为表的主键

        通常不用业务字段作为主键,单独给每张表设计一个 id 的字段,把 id 作为主键。

        主键就是给数据库和程序使用的,不是给最终的客户使用的,所以主键有没有含义没有关系,只有不重复,非空就行。

      3、创建主键

      •    主键关键字:primary key
      •    主键的特点: ① 非空 not  null; ② 唯一
      •    基本语法     

          在创建表时,添加主键约束

    create table student(
    	id int primary key,-- 给id添加主键约束
    	name varchar(20)
    );

          ② 删除主键

    ALTER TABLE student DROP PRIMARY KEY;

         

          ③ 创建完表后添加主键(两种方式)

    ALTER TABLE student MODIFY id int PRIMARY KEY;   
    ALTER TABLE student add primary key(字段名);

        注意

          ① 主键非空且唯一

          ② 一张表只能有一个字段(组)作为主键

          ③ 主键就是表中记录的唯一标识

      4、主键自增

        主键如果让自己添加很有可能重复,所以希望在每次插入新记录时,数据库自动生成主键字段的值。

        基本语法格式:

        ① 创建表时,添加主键约束,并且完成主键自增长(字段类型必须是整数类型)

    create table student(
    	id int primary key auto_increment,-- 给id添加主键约束
    	name varchar(20)
    );

        ② 删除自动增长

    ALTER TABLE stu MODIFY id INT;

        ③ 创建表完后,添加自动增长

    ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

      5、修改自增长的默认值起始值

        默认 auto_increment 的开始值是 1,如果希望修改起始值,使用下面语法。

        ① 创建时指定起始值

    CREATE TABLE 表名(
        列名 int primary key AUTO_INCREMENT
    ) AUTO_INCREMENT=起始值;
    

        ② 创建好以后修改起始值

    ALTER TABLE 表名 AUTO_INCREMENT=起始值;

      6、delete 和 truncate 对自增长的影响

      •   delete:删除所有记录之后,自增长没有影响。
      •   truncate:删除以后,自增长又重新开始。

    三、唯一约束

      1、概念

        唯一约束概念:表中的某一列不能出现重复的值,必须保证值的唯一性。

      2、基本语法格式

        ① 创建表时,添加唯一约束

    CREATE TABLE student(
    	id INT,
    	phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
    );
    

                  注意:在MySQL中,唯一约束限定的列的值可以有多个 null。(null表示不确定,即不相等)

        ② 删除唯一约束

    ALTER TABLE student DROP INDEX phone_number;

        ③ 在创建表后,添加唯一约束

    ALTER TABLE student MODIFY phone_number VARCHAR(20) UNIQUE;
    

    四、非空约束

      1、非空约束概念

        非空约束:即数据表的某一列不能为 null。

      2、基本语法格式

        ① 创建表时添加约束

    CREATE TABLE student(
    	id INT,
    	NAME VARCHAR(20) NOT NULL -- name为非空
    );

        ② 创建表完后,添加非空约束

    ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

        ③ 删除 某个字段的非空约束

    ALTER TABLE stu MODIFY NAME VARCHAR(20);
    

      3、为某字段设置默认值

        语法格式

    字段名 字段类型 DEFAULT 默认值
    

              Demo:

     1 create table student(
     2     id int,
     3     name varchar(20),
     4     sex varchar(2) default '男'
     5 )
     6 
     7 -- 添加一条记录,使用默认值
     8 insert into student values(6,'赵六',default)
     9 -- 添加一条记录,不适用默认值
    10 insert into student values(8,'钱九','男')

       扩展:如果一个字段设置了非空和为约束,该字段与主键有什么区别?

         (1)主键在一个表中,只能有一个。不能出现多个主键。主键可以单列,也可以是多列

         (2)自增长只能用在主键上。

    五、外键约束

      1、单表存储数据的缺点

        单表存储数据可能会造成的缺点:

          ① 数据冗余

          ② 后期还会出现增删改的问题

        解决方式:使用外键约束

      2、外键约束

        外键约束概念:foreign key,让从表中与主表主键对应的那一列,从而保证数据的正确性。

        主表:一方,用来约束别人的表。

        从表:多方,被别人约束的表。

        示意图

        

      3、创建约束的语法

        ① 创建表时增加外键

    create table 表名(
    	....
    	外键列
    	[constraint] [外键名称] foreign key (外键列名称) references 主表名称(主表列名称)
    );

        ② 删除外键

    ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

        ③ 创建表之后添加外键

    ALTER TABLE 表名 ADD [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

      4、外键的级联操作

        当改变主表中的主键时,修改失败;在删除主表中的记录时,也出现删除失败。

        级联操作:在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作。

        级联操作语法:

    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
    on update cascade; 表示级联更新操作
    on delete cascade; 表示级联删除操作

    六、数据约束总结

    约束名 关键字 说明
    主键 primary key

    ① 唯一

    ② 非空

    默认 default 如果一列没有值,使用默认值
    非空 not null 这一列必须有值
    唯一 unique 这一列不能有重复值
    外键 foreign key 主表中主键列,在从表中外键列
  • 相关阅读:
    2009年度最佳jQuery插件
    转:Jeff Dean的Stanford演讲
    Zookeeper的RPC框架
    转:电商推荐技术
    NoSQL设计思想(从辅到主)
    工作一年小结
    转:MySQL索引背后的数据结构
    java多线程并发,java的几种状态
    转发:Linux Socket编程
    几个linux shell的讲解网站
  • 原文地址:https://www.cnblogs.com/niujifei/p/11584973.html
Copyright © 2011-2022 走看看