MySQL的约束

主键约束

能够唯一确定一张表中的一条记录,通过给某个字段添加约束,就可以使得该字段不重复且不为空

create table user(
    id int primary key,
    name varchar(20)
);

上图中的PRI表示主键

insert into user/*表名下同*/ values(1, "张三");   /*此处可以运行*/
insert into user values(1, "李四");
insert into user values(null, "王五");
/*后面两行不能运行*/

联合主键

有时需要多个字段联合起来才能作为主键确定表中唯一一条记录

create table user2(
        id int,
        name varchar(20),
        password varchar(20),
        primary key(id, name)
);

添加记录

不会报错,因为是使用id和name作为联合主键,联合主键中任何一个字段不能为空(添加记录时)

自增约束

create table user3(
    id int primary key auto_increment,
    /*效果就是管控id的值,让他可以自动增长*/
    name varchar(20)
);

自增约束可以在添加使用时该主键的值为null,如下

insert into user1 value(null,"李四");

修改表结构

创建表时忘记创建主键

add
create table user2(
    id int,
    name varchar(20)
);

describe user2; /*可以使用缩写desc*/
alter table user2/*表名*/
add primary key(id/*需要添加的主键*/);
modify
alter table user2 modify id int primary key;

删除主键

alter table user2 drop primary key;

唯一约束

MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为’0001’,那么该表中就不能出现另一条记录的 id 值也为’0001’。

唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是只能有一个空值。而主键约束在一个表中只能有一个,且不允许有空值。比如,在用户信息表中,为了避免表中用户名重名,可以把用户名设置为唯一约束。

create table user4(
    id int,
    name varchar(20)
);

alter table user4 add unique(name);

desc user4

会出现一个key = UNI

第二个就会报错,因为要求name是唯一的

在创建时定义唯一约束

create table user5(
    id int,
    name varchar(20) unique
);

desc user5;

下面这种就是两个键加起来不重复就是ok的,并不是强制要救如果一个重复就报错

create table user6(
    id int,
    name varchar(20),
    unique(id, name)
);

desc user6;

创建后添加唯一约束

add

alter table user5/*表名字*/ add constraint unique(name/*要添加唯一约束的字段*/);

modify

alter table user5/*表名字*/ modify id int/*要添加唯一约束的字段名及其数值类型及空间*/ unique;

删除唯一约束

alter table user5/*表名*/ drop index name/**唯一约束名/;

非空约束

MySQL 非空约束(NOT NULL)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。

create table user7(
    id int,
    name varchar(20) not null  /*此处添加的not null就是非空约束*/
);

如果只添加了id的值,比如

insert into user7 (id) values (7);

会报错类似 (1364 – Field ‘name’ doesn’t have a default value) 的错误

默认约束

create table user8(
    id int,
    name varchar(20),
    age int default 10  /*此处指定了默认值,插入时未指定时使用,如果有值就会被覆盖*/
);

上面这种就是10就是为指定时是哟个默认值,21就是把10覆盖的那个值

外键约束

MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。(也可以是主表和附表)

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

create table classes(
    id int primary key,
    name varchar(20)
);

create table students(
    id int primary key,
    name varchar(20),
    class_id int,
    foreign key(class_id/*本表中作为外键的字段*/)
            references classes/*主表*/(id/*主表中与附表外键相关联的字段*/)
);
insert into classes  values (1, "一班");
insert into classes  values (2, "二班");
insert into classes  values (3, "三班");
insert into classes  values (4, "四班");

insert into students values (1001, "david", 1);
insert into students values (2001, "lily", 2);
insert into students values (5001, "lisa", 5); /*这一行会报错*/
/*附表要参照主表去添加,如果主表中不存在这个值,则会报错*/

报错: (1452 – Cannot add or update a child row: a foreign key constraint fails\ (test.students, CONSTRAINT students_ibfk_1 FOREIGN KEY (class_id) REFERENCES classes (id)))

delete from classes where  name = "一班";
/*注意主表的值被附表引用时,那么主表中该条数据记录就不能被删除,除非把对应的附表记录先删除,
或者就做软删除,即用户看不到,但是数据库中还是存在这条记录*/

报错: (1451 – Cannot delete or update a parent row: a foreign key constraint fails\ (test.students, CONSTRAINT students_ibfk_1 FOREIGN KEY (class_id) REFERENCES classes (id)))

Original: https://www.cnblogs.com/wojiuyishui/p/16494212.html
Author: 我就一水
Title: MySQL的约束

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578672/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 搭建redis集群

    这里总结性给出搭建步骤: 1、 至少6个节点,三主三从 2、 编译redis源码 3、放置集群的配置文件redis.conf 创建工作目录: 每个文件夹下新建redis.conf …

    Linux 2023年5月28日
    097
  • 安卓手机改造服务器——基本环境配置(CentOS7 arm32)

    安装好CentOS系统之后,我们需要对环境进行一些基本的配置,让Linux更好用 注意:本文章是针对 arm32的 CentOS7进行配置的,其他系统或不同架构不要尝试。 1、首先…

    Linux 2023年6月8日
    0117
  • Jenkins+svn自动化部署完整教程

    1、概述 Jenkins 是一个可扩展的持续集成引擎。主要用于持续、自动地构建/测试软件项目、监控一些定时执行的任务。Jenkins用Java语言编写,可在Tomcat等流行的se…

    Linux 2023年6月7日
    096
  • 一位美国教授的科研诀窍:每周工作100小时(转)

    今天看到了,Xinyu Zhang 的一篇文章,深受启发,转载一下。 OSU计算机系一位教授到北大讲座,学生提问:您组里发了那么多牛paper,有什么诀窍? 教授回答:我们组里,从…

    Linux 2023年6月14日
    0108
  • 安装完Ubuntu启动时自动进入grub命令行模式的解决办法

    1.先使用ls命令,找到Ubuntu的安装在哪个分区: grub>ls 会罗列所有的磁盘分区信息,比方说: (hd0,1),(hd0,5),(hd0,3),(hd0,2) 2…

    Linux 2023年6月13日
    094
  • 散列数据结构以及在HashMap中的应用

    1. 为什么需要散列表? 对于线性表和链表而言,访问表中的元素,时间复杂度均为O(n)。即便是通过树结构存储数据,时间复杂度也为O(logn)。那么有没有一种方式可以将这个时间复杂…

    Linux 2023年6月7日
    0138
  • Linux之间的文件传输方式

    大数据集群往往涉及文件复制。我在研究大数据时总结了几种方法。 [En] Big data cluster often involves file copying. I summed…

    Linux 2023年5月27日
    0135
  • mysql 8.0.20 忘记密码,修改密码

    由于mysql更新较快,8.0对比5.7很多操作有了变化,特别修改密码,和忘记密码这一块已经和以前完全不一样了。 一、 忘记密码 1、 在my.cnf 文件中添加skip-gran…

    Linux 2023年6月6日
    0108
  • SQLI-LABS(Less-7)

    Less-7(GET-Dump into outfile-String) 打开 Less-7页面,可以看到页面中间有一句 Please input the ID as parame…

    Linux 2023年6月6日
    080
  • [20220106]ora-00600 kokasgi1.txt

    [20220106]ora-00600 kokasgi1.txt –//上午看了https://www.xifenfei.com/2022/01/2022-first-…

    Linux 2023年6月13日
    093
  • Java — 面向对象

    简介:类是对事物的一种描述,对象则为具体存在的事物。 类的定义: public class 类名 { // 成员变量 访问修饰符 数据类型 变量名; … // 成员方法 访问修…

    Linux 2023年6月8日
    095
  • Django orm的managed参数

    Django orm的managed参数 如果一张表不是在django的models.py中创建表,而是该表由cmd或者Navicat或者其他方式创建的,或者该表是一个视图,那么也…

    Linux 2023年6月14日
    093
  • Linux 下安装 node.js

    这里介绍两种安装方式: 编译安装和使用编译后的安装包安装。 安装目录: /usr/local 一、使用编译安装包安装 1、进入安装目录: 2、下载安装包: 3、解压: 4、进入解压…

    Linux 2023年6月13日
    0100
  • Go 字符串切割技巧

    标准库专门提供了一个包 strings 进行字符串的操作,随着go1.18新增的 Cut 函数,字符串处理也更加方便了。 Cut 函数的签名如下: 将字符串 s 在第一个 sep …

    Linux 2023年6月6日
    087
  • 系统初始化

    一般系统安装好后,按照自己习惯定义 csharp;gutter:true;</p> <h1>alias</h1> <p>echo &…

    Linux 2023年6月7日
    060
  • django学习__1

    Django python网络编程回顾 之前我们介绍过web应用程序和http协议,简单了解过web开发的概念。Web应用程序的本质 接收并解析HTTP请求,获取具体的请求信息 处…

    Linux 2023年6月7日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球