精华内容
下载资源
问答
  • mysql 完整性约束
    千次阅读
    2021-03-15 16:54:58

    mysql 完整性约束

    数据的完整性概述

    根据完整性实施的方法将完整性约束分为四类:

    1、实体完整性

    实体完整性的实现:通过在表中设置主键约束、唯一约束或标识列来实现

    主键约束:应用于表列的一个约束

    用法:primary key(字段名)

    唯一约束:给定列的所有值必须唯一

    用法:(字段)unique

    2、域完整性

    域完整性:指给定列的输入有效性。强制域有效性的方法有:限制数据类型、格式(检查约束)、可能值(外键约束、检查约束、默认值定义、非空约束)

    非空约束:在数据录入时不允许null值

    用法:(字段)not null

    检查约束:check

    默认值:default

    3、引用完整性

    引用完整性:指在有关联关系的表中,确保一个表的外键的值来源于另一个表中的主键值。如果表中主键值改变了,外键的值也必须改变。

    4、用户自定义完整性

    删除或者添加完整性约束

    删除约束

    alter table 表名 drop constraint 约束名字

    添加约束

    alter table 表名 add constraint 约束

    更多相关内容
  • MySQL完整性约束

    2022-03-19 12:31:38
    MySQL完整性约束 (外键约束和非外键约束) 表级约束(在创建时添加到,后面) create table t_student( sno int(6) auto_increment,-- 代表显示长度 不过多了也没事 sname varchar(10) not null,-- 是个字符 ...

    MySQL完整性约束 (外键约束和非外键约束)

    • 表级约束(在创建时添加到,后面)

    create table t_student(
    	sno int(6) auto_increment,-- 代表显示长度 不过多了也没事
    	sname varchar(10) not null,-- 是个字符
    	sex char(1) default '男', -- 
    	age int(3),
    	enterdate date,
    	classname varchar(10),
    	email varchar(20),
    	constraint pk_stu primary key(sno), -- pk_stu 主键约束的名字 但是自增约束只能在列后面
    	constraint ck_stu_sex check (sex='男'||sex='女'),
    	constraint ck_stu_age check (age>=18 and age <=50),
    	constraint uq_stu_email unique(email)
    );
    
    • 列级约束

    create table t_student(
    	sno int(6) primary key auto_increment,-- 代表显示长度 不过多了也没事
    	sname varchar(10) not null,-- 10个字符 不能为空
    	sex char(1) default '男' check(sex='男' || sex='女'), -- 默认值 检查约束 
    	age int(3) check(age>=18 and age<=50),
    	enterdate date,
    	classname varchar(10),
    	email varchar(20) unique -- 唯一的约束
    );
    

    在建表后添加约束:

    alter table t_student add constraint pk_stu primary key (sno);
    alter table t_student modify sno int(6) auto_increment;-- 修改自增条件
    alter table t_student add constraint ck_stu_age check (age>=18 and age<=50);
    alter table t_student add constraint ck_stu_sex check (sex="男"||sex="女");
    alter table t_student add constraint uq_stu_email unique (email);
    
    
    查看表结构:
    desc t_student;
    

    qAMYvT.png

    常见错误:

    • 单独自增约束必定需要主键 否则会报错

    create table t_student(
    	sno int(6) auto_increment,-- 代表显示长度 不过多了也没事
    	sname varchar(10),-- 是个字符
    	sex char(1), -- 
    	age int(3),
    	enterdate date,
    	classname varchar(10),
    	email varchar(20)
    );
    
    错误:
    Incorrect table definition; there can be only one auto column and it must be defined as a key
    解决方法:去掉自增或者加上主键
    

    外键约束

    qAMzin.png

    -- 外键约束
    create table t_class(
    	cno int(4) primary key auto_increment,
    	cname varchar(10) not null,
    	room char(4)
    )
    -- 添加班级数据
    insert into t_class values(null,"python001",'r406');
    insert into t_class values(null,"python002",'r408');
    insert into t_class values(null,"c/c++001",'r108');
    
    -- 一次性添加多条数据:
    insert into t_class values (null,"python001",'r406'),(null,"python002",'r408'),(null,"c/c++001",'r108');
    
    -- 查询班级表
    select * from t_class;
    
    -- 删除原先学生表
    drop table t_student;
    
    -- 创建学生表
    create table t_student(
    	sno int(6) primary key auto_increment,-- 代表显示长度 不过多了也没事
    	sname varchar(10) not null,-- 10个字符 不能为空
    	classno int(4) -- 取值参考t_class中的cno字段
    );
    insert into t_student values (null,"张三",1),(null,"李四",1),(null,"王五",2);
    select * from t_student;
    
    
    -- 出现问题
    -- 1.添加一个学生班级为4   但是根本没有四班
    insert into t_student values (null,"丽丽",4);
    
    -- 2.想删除班级2:但是学生信息里面还没删除
    delete from t_class where cno = 2;
    
    -- 解决办法:添加外键约束
    -- 注意 外键约束只有表级约束 没有列级约束
    -- 1.在表内增加外键约束
    create table t_student(
    	sno int(6) primary key auto_increment,
    	sname varchar(10) not null,-- 10个字符 不能为空
    	classno int(4), -- 取值参考t_class中的cno字段
    	constraint fk_stu_classno foreign key (classno) references t_class (cno)
    );
    -- 2.在建表后增加外键爱约束
    create table t_student(
    	sno int(6) primary key auto_increment,
    	sname varchar(5) not null,
    	classno int(4)
    )
    alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class (cno)
    
    -- 添加学生
    insert into t_student values (null,"张三",1),(null,"李四",1),(null,"王五",2);
    -- 报错:
    --  1452 - Cannot add or update a child row: a foreign key constraint fails (`mytestyt`.`t_student`, CONSTRAINT `fk_stu_classno` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
    -- 因为没有这个班级2 所以不能添加 问题解决
    insert into t_student values (null,"张三",1),(null,"李四",1),(null,"王五",3);
    -- 删除班级1
    delete from t_class where cno =1;
    -- 报错不能删除 因为这个班级已经有人了
    select * from t_student;
    -- > 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`mytestyt`.`t_student`, CONSTRAINT `fk_stu_classno` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
    -- 问题解决
    
    

    外键策略:

    -- 删除班级2:如果直接删除肯定时不行的 因为有外键约束
    -- 加入外键策略
    
    -- 策略1. no action 不允许删
    -- 通过操作sql来完成
    -- 先把班级二的班级改为其他班
    update t_student set classno = null where classno =2;
    delete from t_class where cno = 2;
    
    -- 策略2.cascade 级联操作 :操作主表的时候影响从表的外键按信息:
    -- 先删除外键约束
    alter table t_student drop foreign key fk_stu_classno;
    -- 重新添加外键约束:
    alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class(cno) on update cascade on delete cascade;
    -- 试试更新操作
    update t_class set cno = 5 where cno =3;
    
    -- 试试删除
    delete from t_class where cno =1; -- class 和student都删了
    
    
    -- 策略3. set null 置空操作
    -- 先删除外键约束
    alter table t_student drop foreign key fk_stu_classno;
    alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class(cno) on update set null on delete set null;
    -- 试试更新:
    update t_class set cno =9  where cno = 6; 
    -- 然后班级为6的全部都置空了
    
    -- 注意 策略二的级联操作和策略三删除操作可以混着使用:
    alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class(cno) on update set null on delete set null;
    
    -- 应用场合
    (1) 朋友圈删除,点赞留言都删除 -- 级联操作
    (2)解散班级,对应学生置空班级
    

    t_student add constraint fk_stu_classno foreign key (classno) references t_class(cno) on update set null on delete set null;

    – 应用场合
    (1) 朋友圈删除,点赞留言都删除 – 级联操作
    (2)解散班级,对应学生置空班级

    
    
    展开全文
  • mysql完整性约束

    2021-11-10 17:59:51
    文章目录一、完整性约束1.1 MySQL支持的完整性约束1.2 主键约束1.2.1 新创建表,添加主键1.2.2 给已有表添加主键1.2.3 删除主键约束1.3 唯一约束 unique1.3.1 列级添加唯一约束1.3.2 表级添加唯一约束1.3.3 给已有表...

    一、完整性约束

    1.1 MySQL支持的完整性约束

    约束条件描述
    primary key主键约束
    unique唯一约束
    not null非空约束
    default默认约束
    auto_increment自动增长约束
    foreign key外键约束

    1.2 主键约束

    特点:唯一且非空
    主键可以由一个字段组成 也可以由多个字段组成(复合主键)
    如果主键可以由一个字段组成,则既可以添加到列级也可以添加到表级
    如果由多个字段组成只能添加到表级
    目的: 为了保证每一行不重复

    1.2.1 新创建表,添加主键

    (1)在字段的列级添加约束

    create table 表名(
    字段名 字段类型 primary key
    )
    

    例如:创建student1表(id name age sex)其中id为主键

    create table student1 (
    	id int unsigned not null auto_increment primary key, 
    	age tinyint unsigned, 
    	sex enum('male','female') default 'male
    );
    

    (2)表级上添加主键约束

    create table 表名(
    	字段名1 字段类型1,
    	字段名2 字段类型2,
    	.....
    	字段名n 字段类型n,
    	[constraint 主键约束名] primary key(字段名)
    )
    

    例如:创建student2表(id name age sex)其中id为主键在表级添加主键约束

    create table student2 (
    	id int unsigned not null auto_increment, 
    	age tinyint unsigned, 
    	sex enum('male','female') default 'male',
    	constraint pk_student2_id primary key(id) 
    );
    
    mysql> desc student2;
    +-------+-----------------------+------+-----+---------+----------------+
    | Field | Type                  | Null | Key | Default | Extra          |
    +-------+-----------------------+------+-----+---------+----------------+
    | id    | int(10) unsigned      | NO   | PRI | NULL    | auto_increment |
    | age   | tinyint(3) unsigned   | YES  |     | NULL    |                |
    | sex   | enum('male','female') | YES  |     | male    |                |
    +-------+-----------------------+------+-----+---------+----------------+
    
    

    (3)多个字段作为主键,只能添加到表级

    create table 表名(
    	字段名1 字段类型1,
    	字段名2 字段类型2,
    	.....
    	字段名n 字段类型n,
    	[constraint 主键约束名] primary key(字段名1,字段名2)
    	)
    

    例如:创建student3表(school id name age sex)其中school 和id为主键在表级添加主键约束

    create table student3 (
    	id int unsigned not null auto_increment, 
    	school varchar(10),
    	name varchar(20),
    	age tinyint unsigned, 
    	sex enum('male','female') default 'male',
    	constraint pk_student3_id_school primary key(id,school) 
    );
    
    mysql> desc student3;
    +--------+-----------------------+------+-----+---------+----------------+
    | Field  | Type                  | Null | Key | Default | Extra          |
    +--------+-----------------------+------+-----+---------+----------------+
    | id     | int(10) unsigned      | NO   | PRI | NULL    | auto_increment |
    | school | varchar(10)           | NO   | PRI | NULL    |                |
    | name   | varchar(20)           | YES  |     | NULL    |                |
    | age    | tinyint(3) unsigned   | YES  |     | NULL    |                |
    | sex    | enum('male','female') | YES  |     | male    |                |
    +--------+-----------------------+------+-----+---------+----------------+
    
    

    1.2.2 给已有表添加主键

    语法:alter table 表名 add [constraint 主键约束名] primary key(字段名)
    例如:创建表student4 ,不加id主键约束,创建完后添加主键约束

    create table student4 (
    	id int unsigned not null, 
    	school varchar(10),
    	name varchar(20),
    	age tinyint unsigned, 
    	sex enum('male','female') default 'male'
    	);
    mysql> desc student4;
    +--------+-----------------------+------+-----+---------+-------+
    | Field  | Type                  | Null | Key | Default | Extra |
    +--------+-----------------------+------+-----+---------+-------+
    | id     | int(10) unsigned      | NO   |     | NULL    |       |
    | school | varchar(10)           | YES  |     | NULL    |       |
    | name   | varchar(20)           | YES  |     | NULL    |       |
    | age    | tinyint(3) unsigned   | YES  |     | NULL    |       |
    | sex    | enum('male','female') | YES  |     | male    |       |
    +--------+-----------------------+------+-----+---------+-------+
    
    
    alter table student4 add constraint pk_student4_id primary key(id)
    mysql> desc student4;
    +--------+-----------------------+------+-----+---------+-------+
    | Field  | Type                  | Null | Key | Default | Extra |
    +--------+-----------------------+------+-----+---------+-------+
    | id     | int(10) unsigned      | NO   | PRI | NULL    |       |
    | school | varchar(10)           | YES  |     | NULL    |       |
    | name   | varchar(20)           | YES  |     | NULL    |       |
    | age    | tinyint(3) unsigned   | YES  |     | NULL    |       |
    | sex    | enum('male','female') | YES  |     | male    |       |
    +--------+-----------------------+------+-----+---------+-------+
    
    

    1.2.3 删除主键约束

    语法alter table 表名 drop primary key;
    例如:删除表student4中的主键约束

    alter table student4 drop primary key;
    
    mysql> desc student4;
    +--------+-----------------------+------+-----+---------+-------+
    | Field  | Type                  | Null | Key | Default | Extra |
    +--------+-----------------------+------+-----+---------+-------+
    | id     | int(10) unsigned      | NO   |     | NULL    |       |
    | school | varchar(10)           | YES  |     | NULL    |       |
    | name   | varchar(20)           | YES  |     | NULL    |       |
    | age    | tinyint(3) unsigned   | YES  |     | NULL    |       |
    | sex    | enum('male','female') | YES  |     | male    |       |
    +--------+-----------------------+------+-----+---------+-------+
    
    

    1.3 唯一约束 unique

    指:表中字段的值不能重复

    1.3.1 列级添加唯一约束

    语法:

    create table 表名(
    	字段名1 字段类型1 unique,
    	字段名2 字段类型2,
    	.....
    	字段名n 字段类型n)
    

    例如: 创建表student5 给name字段添加唯一约束

    
    create table student5 (
    	id int unsigned not null primary key auto_increment, 
    	school varchar(10),
    	name varchar(20) unique,
    	age tinyint unsigned, 
    	sex enum('male','female') default 'male'
    	);
    
    mysql> desc student5;
    +--------+-----------------------+------+-----+---------+----------------+
    | Field  | Type                  | Null | Key | Default | Extra          |
    +--------+-----------------------+------+-----+---------+----------------+
    | id     | int(10) unsigned      | NO   | PRI | NULL    | auto_increment |
    | school | varchar(10)           | YES  |     | NULL    |                |
    | name   | varchar(20)           | YES  | UNI | NULL    |                |
    | age    | tinyint(3) unsigned   | YES  |     | NULL    |                |
    | sex    | enum('male','female') | YES  |     | male    |                |
    +--------+-----------------------+------+-----+---------+----------------+
    	
    

    1.3.2 表级添加唯一约束

    语法:

      create table 表名(
            字段名1 字段类型1,
            字段名2 字段类型2,
                  .....
            字段名n 字段类型n,
            [constraint 唯一约束名] unique(字段1,字段2...)
        );
    

    例如:创建表student6,给id 和name添加唯一约束

    create table student6 (
    	id int unsigned not null primary key auto_increment, 
    	school varchar(10),
    	name varchar(20),
    	age tinyint unsigned, 
    	sex enum('male','female') default 'male',
    	constraint uk_student6_id_name unique(id,name)
    	);
    	
    

    1.3.3 给已有表添加唯一约束

    alter table 表名 add [constraint 唯一约束名] unique(字段1,字段2...)

    例如:创建表student7后 给表中name添加唯一约束

    create table student7 (
    		id int unsigned not null primary key auto_increment, 
    		school varchar(10),
    		name varchar(20),
    		age tinyint unsigned, 
    		sex enum('male','female') default 'male'
    		);
    
    alter table student7 add constraint uk_student7_name unique(name);
    

    1.3.4 删除唯一约束

    alter table 表名 drop index 唯一约束名
    注意:
    如果单个字段没有指定唯一约束名,则默认的唯一约束名为字段名
    如果是多个字段组合为唯一约束时候,默认的唯一约束名为第一个字段的名称
    如果指定了约束名则删除的时候写约束名
    例如:删除表student7中的唯一约束

    alter table student7 drop index uk_student7_name
    

    1.4 非空 not null

    某张表中某字段的值不能为空
    注意:
    1.只能使用列级添加
    2.空字符串"" 或者0 都不是null

    1.4.1 列级添加非空约束

    create table 表名(
      字段名 字段类型 not null 
    )
    

    例如:创建student8表,给name添加非空约束

    	
    create table student8 (
    	id int unsigned not null primary key auto_increment, 
    	school varchar(10),
    	name varchar(20),
    	age tinyint unsigned, 
    	sex enum('male','female') default 'male'
    	);
    

    1.4.2 给已有表添加非空约束

    alter table 表名 modify 字段名 字段类型 not null

    例如:创建student9后,给字段name添加非空约束

    create table student9 (
    		id int unsigned not null primary key auto_increment, 
    		school varchar(10),
    		name varchar(20),
    		age tinyint unsigned, 
    		sex enum('male','female') default 'male'
    		);
    
    alter table student9 modify name varchar(20) not null;
    
    mysql> desc student9;
    +--------+-----------------------+------+-----+---------+----------------+
    | Field  | Type                  | Null | Key | Default | Extra          |
    +--------+-----------------------+------+-----+---------+----------------+
    | id     | int(10) unsigned      | NO   | PRI | NULL    | auto_increment |
    | school | varchar(10)           | YES  |     | NULL    |                |
    | name   | varchar(20)           | NO   |     | NULL    |                |
    | age    | tinyint(3) unsigned   | YES  |     | NULL    |                |
    | sex    | enum('male','female') | YES  |     | male    |                |
    +--------+-----------------------+------+-----+---------+----------------+
    
    

    1.4.3 删除非空约束

    alter table 表名 modify 字段名 字段类型 [null]
    例如:删除student9中name字段的非空约束

    alter table student9 modify name varchar(20) null;
    
    mysql> desc student9;
    +--------+-----------------------+------+-----+---------+----------------+
    | Field  | Type                  | Null | Key | Default | Extra          |
    +--------+-----------------------+------+-----+---------+----------------+
    | id     | int(10) unsigned      | NO   | PRI | NULL    | auto_increment |
    | school | varchar(10)           | YES  |     | NULL    |                |
    | name   | varchar(20)           | YES  |     | NULL    |                |
    | age    | tinyint(3) unsigned   | YES  |     | NULL    |                |
    | sex    | enum('male','female') | YES  |     | male    |                |
    +--------+-----------------------+------+-----+---------+----------------+
    
    

    1.5 默认值约束(default)

    指在没有对某字段插入具体值时候会去默认的值
    注意:
    1.只能使用列级约束
    2.对于使用默认值约束,如果插入的数据为“null”,则不会使用默认值,只有没有插入数据时候,才会使用默认值

    1.5.1 列级添加默认值约束

    语法:

     create table 表名(
          字段名  字段类型  default  value
        )
    

    例如:创建表student10 ,其中对sex字段设置默认值为’male’

    create table student10 (
    	id int unsigned not null primary key auto_increment, 
    	school varchar(10),
    	name varchar(20),
    	age tinyint unsigned, 
    	sex enum('male','female') default 'male'
    	);
    
    

    1.5.2 给已有表添加默认值约束

    alter table 表名 modify 字段名 字段类型 default value;
    例如:创建表student11后,给sex字段设置默认值为’男’

    alter table student11 modify sex enum('male','female') default 'male'
    

    1.5.3 删除默认值约束

    alter table 表名 modify 字段名 字段类型;
    例如:删除表student11 sex字段的默认值为’男’约束

    alter table student11 modify sex enum('male','female')
    

    1.6 自动增长约束(auto_increment)

    指:表中某字段的值会自动增加
    注意:
    1.一张表中只能有一个自动增长的字段
    2.配合主键一起使用 并且只适用于整数类型
    3.自动增长默认的初始值1,每增加一条记录,该字段的值会增加1

    1.6.1 创建表时候创建自动增长约束

    create table 表名(
      字段名  字段类型 auto_increment
    )
    

    例如:创建表student12 ,给id添加主键及自动增长约束

    create table student12 (
    	id int unsigned not null primary key auto_increment, 
    	school varchar(10),
    	name varchar(20),
    	age tinyint unsigned, 
    	sex enum('male','female') default 'male'
    	);
    

    1.6.2 给已有表添加自动增长约束

    语法:alter table 表名 modify 字段名 字段类型 auto_increment
    例如:创建表student13后,给表中字段id添加auto_increment约束

    alter table student13 modfiy id int auto_increment
    

    1.6.3 删除自增长约束

    语法:alter table 表名 modify 字段名 字段类型
    例如 删除表student13中auto_increment 约束

    alter table student13 modify id int unsigned not null primary key
    
    注意,当某一个字段同时有 default 、auto_increment、 not null 约束时,如果单纯的想删除一个,需要把其他的约束重新写一边,否则会全部删除

    例如:

    	create table student15 (
    		id int not null primary key auto_increment,
    		name varchar(20) default 'bertwu' not null
    	)	
    

    如果只想删除name字段的default,则语法如下:

    alter table student15 modify name varchar(20) not null;
    

    1.7 外键约束(foreign key)

    外键:某一张表中某字段的值依赖于另一张表中某字段的值
    主要实现了数据库中的参照完整性
    将两张表紧密结合,对某张表修改或者删除时候,要保证数据的完整

    例如:班级(t_class) 学生(t_student) 关系 1:n

    1.7.1 创建外键约束

    注意:虽然MySQL提供了列级添加外键约束,但添加完后不会生效,所以使用表级添加外键约束
    语法:

    create table 表名(
            字段名  字段类型,
            ...
           [constraint  外键约束名]  foreign key(字段名)  references  表(字段名)  
          )
    

    例如:班级(class) 学生(student)

    # 创建班级表
    create table class(
    	id int not null primary key auto_increment,
    	name varchar(10) not null
    
    );
    
    # 创建学生表
    create table student(
    	id int not null primary key auto_increment,
    	name varchar(10) not null,
    	age tinyint,
    	class_id int(2),
    	constraint fk_class_student foreign key(class_id) references class(id)
    )
    
    mysql> desc class;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(10) | NO   |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)
    
    mysql> desc student;
    +----------+-------------+------+-----+---------+----------------+
    | Field    | Type        | Null | Key | Default | Extra          |
    +----------+-------------+------+-----+---------+----------------+
    | id       | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name     | varchar(10) | NO   |     | NULL    |                |
    | age      | tinyint(4)  | YES  |     | NULL    |                |
    | class_id | int(2)      | YES  | MUL | NULL    |                |
    +----------+-------------+------+-----+---------+----------------+
    

    1.7.2 在已有表中添加外键约束

    语法:
    alter table 表名 add [constraint 外键约束名] foreign key(字段名) references 表(字段名)
    例如:创建 学生(tt_student)表,之后为其添加外键。

    create table tt_student(
    		id int not null primary key auto_increment,
    		name varchar(10) not null,
    		age tinyint,
    		class_id int(2)
    	)
    	
    alter table tt_student add constraint fk_class_tt_student foreign key(class_id) references class(id)	
    

    1.7.3 删除外键约束

    alter table 表名 drop foreign key 外键约束名

    例如将表tt_student 中外键约束名删除

    alter table tt_student drop foreign key fk_class_tt_student
    

    1.7.4 有关系的表进行删除

    方式1. 先删除有外键约束的表,再删除主表
    例如:先删除tt_student表 再删除class

    drop table tt_student
    drop table class
    

    方式2. 先删除外键约束再删除表

    alter table tt_student drop foreign key fk_class_tt_student
    drop table class
    
    展开全文
  • 本文实例讲述了mysql完整性约束。分享给大家供大家参考,具体如下: 主要内容 not null 与 default unique primary auto_increment foreign key 约束条件作用:用于保证数据的完整性和一致性 主要分为 PRIMARY...
  • Mysql完整性约束

    2022-03-28 19:22:25
    一旦定义了完整性约束Mysql就会负责在每次更新后,测试新的数据内容是否符合相关的约束。 二、完整性约束的分类 2.1主键约束 主键就是表中的一列或多个列的一组,它们能够唯一地标识表中的每一行。 通过定义...

    一、完整性约束的定义

    完整性约束(或简称“约束”)是数据库的内容必须随时遵守的规则,它们描述了对数据库的哪一次更新是被允许的。一旦定义了完整性约束,Mysql就会负责在每次更新后,测试新的数据内容是否符合相关的约束。

    二、完整性约束的分类

    2.1主键约束

    主键就是表中的一列或多个列的一组,它们能够唯一地标识表中的每一行。

    通过定义PRIMARY KEY约束来创建主键,而且PRIMARY KEY约束中的列不能取空值。

    可以用两种方式定义主键,作为列或者表的完整性约束。作为列的完整性约束时,只需要在列定义的时候加上关键字PRIMARY KEY 。作为表的完整性约束时,需要在定义的最后列后加上一条PRIMARY KEY(列名,...)语句。

    原则上,任何列或者列的组合都可以充当一个主键。但是主键列必须遵守一些规则:

    1、每个表只能定义一个主键。

    2、关系模型理论要求必须为每一个表定义一个主键。mysql中并没有这样的要求,可以创建一个没有主键的表。为了安全起见,建议为每个基础表指定一个主键。

    3、表中的两个不同的行在主键上不能具有相同的值。即“唯一性原则”。

    4、如果从一个复合主键中删除一列后,剩下的列构成的主键仍然满足唯一性原则,那么,这个复合主键是不正确,即“最小化规则”。

    5、一个列名在一个主键的列的列表中只能出现一次。

    2.2替代键约束

    在关系模型中,替代键像主键一样是表的一列或者一组列,它们的值在任何时候都是唯一的。

    替代键是没有被选作主键的候选键。

    定义替代键的关键字是UNIQUE。

    替代键与主键的主要区别:

    1、一个表只能有一个主键,但可以有多个候选键,甚至可以重合。

    2、主键字段的值不能为空,候选键可以。

    3、都可以自动产生索引。

    2.3参照完整性约束

    参照完整性约束是一种特殊的完整性约束,表现为一个外键。

    当指定一个外键的时候,应遵循以下规则:

    1、必须为被参照表定义主键

    2、必须在被参照表的表名后面指定列名。这个列必须是这个表的之间或替代键。

    3、外键中列的数目必须和被参照表的主键中列数目相同。

    4、外键列的数据类型必须和被参照表主键中列的数据类型相同。

    2.4CHECK完整性约束

    当我们需要限定一些数据的范围时,可以使用check完整性约束。

    CHECK完整性约束在创建表的时候定义。可以定义为列完整性约束,也可以定义为表完整性约。

    2.5命名完整性约束

    如果一条INSERT、UPDATE或DELETE语句违反了完整性约束,则MySql返回一条出错的消息并且拒绝更新,一个更新可能会导致多个完整性约束的违反。在这种情况下,应用程序获取几套出错消息。为了确切地表示出是违反了哪一个完整性约束,可以为每个完整性约束分配一个名字,随后,出错消息包含这个名字,从而使得消息对于应用程序更有意义。

    三、案列

    3.1.1主键定义:创建表xs1,将姓名定义为主键:

    create table wfx.xs1
    (
    学号 varchar(6) null,
    姓名 varchar(8) not null primary key,
    出生日期 datetime
    );

    3.1.2复合主键的定义: 创建course表,学号、课程号、毕业日期定义为主键:

    create table course
    (
    学号 varchar(6) not null,
    姓名 varchar(8) not null,
    毕业日期 date   not null,
    课程号varchar(3),
    学分tinyint,
    primary key(学号,课程号,毕业日期)
    )

     3.1.3通常MySQL自动地为主键创建一个索引primary。我们可以重新给这个索引起名:

    primary key index_primary(学号,课程号,毕业日期)

    3.2.1定义一个替代键:

    create table xs1
    (
    学号 varchar(6) null,
    姓名 varchar(8) not null unique,
    出生日期 datetime
    );
    

    3.2.2定义为表的完整性约束:

    create table xs1
    (
    学号 varchar(6) null,
    姓名 varchar(8) not null,
    出生日期 datetime
    unique(姓名)
    );
    

     

    3.3.1创建表xs2,xs1表中所有学生学号都必须出现在xs2表中:

    create table xs2(
    学号 varchar(6) null,
    姓名 varchar(8) nut null,
    出生日期 datetime null,
    primary key(姓名)
    foreign key(学号)
        references xs1(学号)
            on delete restrict
            on update restrict
    );

    3.3.2与外键相关的被参照表和参照表可以是同一个表,这样的表成为自参照表:

    create table wfx.xs2(
    	学号 varchar(6) not null,
        姓名 varchar(8) not null,
        出生日期 datetime null,
        primary key(学号),
    	foreign key(学号)
    		references xs2(学号)
    )

     

    3.4.1创建表student,性别只能是男或女:

    create table wfx.student(
    	学号 varchar(6) primary key,
    	gender char(6) not null
    		check(gender in('男','女'))
    );

    3.5.1创建表xs3,将姓名定义为主键:

    create table xs3
    (
    学号 varchar(6) null,
    姓名 varchar(8) not null ,
    出生日期 datetime
    constraint primary_key_xs3 primary key(姓名)
    );
    

    感觉有收获,就点个关注吧(感谢、感谢!)!持续更新......

    展开全文
  • 配合实际操作语句,在练习中学会MySQL完整性约束
  • MySQL完整性约束条件

    千次阅读 2018-11-11 19:34:00
    约束条件: Null 允许为空,默认设置,not null不允许为空;注:" "或"null"不为空 key 索引类型 Default 设置默认值,缺省为null Extra 额外设置 索引: 索引优缺点: 优点:通过创建唯一索引,保证数据...
  • 完整性约束条件 完整性约束条件是对字段进行限制,要求用户对该属性进行的操作符合特定的要求。如果不满足完整性约束条件,数据库系统将不再执行用户的操作。 PRIMARY KEY (PK) 标识该字段为该表的主键,可以...
  • MySQL数据库全套视频,带你了解MySQL数据库,免费领取Python自动化学习资料 工具,面试宝典面试技巧
  • MySQL中基本的完整性约束条件如表3-11所示。下表是完整性约束条件: 1. 主键约束(PRIMARY KEY, 简称PK) 主键是表的一个特殊字段,能唯一标识该表中的每条信息。主键和记录的关系,如同身份证和人的关系。主键用来...
  • MySQL数据完整性约束

    千次阅读 2019-01-09 18:29:22
    MySQL中提供了多种完整性约束。 1、主键约束 主键可以是表中的某一列,也可以是表中的多个列所构成的一个组合;其中,由多个列组合而成的主键也称为复合主键。在MySQL中,主键列必须遵守以下规则。 (1)每一个...
  • MYSQL支持的完整性约束  约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。 MYSQL中,常用的几种约束: 约束类型: 主键 外键 唯一...
  • 第7章MySQL表定义与完整性约束控制.docx
  • #五种完整性约束: #NOT NULL :非空约束,指定某列不能为空; #UNIQUE : 唯一约束,指定某列或者几列组合不能重复 #PRIMARY KEY :主键,指定该列的值可以唯一地标识该列记录 #FOREIGN KEY :外键,指定该行记录从...
  • 数据库完整性约束(基于MySQL)1 实体完整性1.1 主键(Primary Key)1.2 主键自增长2 域完整性2.1 非空2.2 唯一3 参照完整性4 用户定义完整性 1 实体完整性 实体完整性是指保证表中所有的行唯一。实体完整性要求表中...
  • 数据库完整性约束基础语句,包含对某些属性的特定取值,定义默认对象,定义和绑定规则,创建级联。文档包含代码和截图,方便查看
  • 一、数据完整性: 即, 数据的准确性和有效性 1) 实体完整性: 关注数据是否唯一. 使用约束: 主键, 唯一 2) 域完整性: 关注数据的格式是否符合要求...二、约束: 用于规范数据完整性的常用手段. 1) 主键约束: 关键字...
  • 展开全部数据完整性约束指的是为了防止不符合规范的数据进入数据库,在用户对数据进行插入e69da5e6ba903231313335323631343130323136353331333431366333、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行...
  • 完整性约束  完整性约束是为了表的数据的正确性!如果数据不正确,那么一开始不能添加到表中。  主键  当某一列添加了主键约束后,那么这一列的数据不能重复出现。这样每行记录中其主键列的值是这一行的标识。...
  • 替代键约束 在关系模型中替代键像主键一样是表的一列或一组列它们的值在任何时候都是唯一的替代键是没有被选做主键的候选键定义替代键的关键字是UNIQUE 例7.11 在表book_copy1中将图书编号作为主键书名列定义为一个...
  • 1.什么是完整性约束, 为什么使用 为了规范数据格式, 在用户进行插入、修改、删除等操作时,DBMS(数据库管理系统(Data Base Management System))自动按照约束条件对数据进行监测, 使不符合规范的数据不能进入数据库,...
  • sql完整性约束有哪些

    千次阅读 2021-01-18 21:24:05
    sql完整性约束有:1、“NOT NULL”非空约束,指定的列不允许为空值;2、“UNIQUE”唯一约束,指定列中没有重复值;3、“PRIMARY KEY”主键约束,唯一的标识出表的每一行;4、“FOREIGN KEY”外键约束;5、“CHECK”...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,336
精华内容 25,734
关键字:

mysql完整性约束

mysql 订阅