MySQL学习(六)约束

文章详细介绍了数据库的DDL操作,包括数据定义语言的用途,如创建和修改表结构。重点讨论了不同类型的约束,如NOTNULL、DEFAULT、PRIMARYKEY、UNIQUE、FOREIGNKEY以及它们的作用和使用场景。此外,还提到了在MySQL中创建和修改表时添加或删除这些约束的方法,以及标识列(自增列)的特性及其操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DDL(Data Definition Language ):

数据定义语言,主要是进行定义/改变表的结构、数据类型、表之间的链接等操作

约束:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性

分类:六大约束

  • NOT NULL:非空,用于保证该字段的值不能为空(比如姓名、学号等)

  • DEFAULT:默认、用于保证该字段有默认值

  • PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空

  • UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空

  • CHECK:检查约束【mysql中不支持】

  • FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值

添加约束的时机:

  1. 创建表的时候

  2. 修改表的时候

约束的添加分类:

  • 列级约束:六大约束语法上都支持,但外键约束没有效果

  • 表级约束:除了非空、默认,其他的都支持

主键和唯一的大对比:

保证唯一性是否允许为空一个表中可以有多少个是否允许组合
主键×至多有一个√,但不推荐
唯一可以有多个√,但不推荐

外键:

  1. 要求在从表设置外键关系

  2. 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求

  3. 主表的关联列必须是一个Key(一般是主键或唯一)

  4. 插入数据时,先插入主表,再插入从表

  5. 删除数据时,先删除从表,再删除主表

    CREATE DATABASE students;
    
    USE students;
    
    # 1.添加列级约束
    /*
    语法:
    直接在字段名和类型后面追加约束类型即可。
    只支持默认、非空、主键、唯一
    */
    CREATE TABLE stuinfo (
    	id INT PRIMARY KEY,#主键
    	stuName VARCHAR ( 20 ) NOT NULL,#非空
    	gender CHAR ( 1 ) CHECK ( gender = '男' OR gender = '女' ),#检查 (不支持)
    	seat INT UNIQUE,#唯一
    	age INT DEFAULT 18,#默认
    	majorId INT REFERENCES major ( id ) #外键 对应major表的id (不支持)
    
    );
    
    #查看stuinfo表中的索引
    SHOW INDEX FROM stuinfo;
    
    CREATE TABLE major(
    id INT PRIMARY KEY,
    majorName VARCHAR(20)
    );
    
    #添加表级约束
    /*
    语法,在各个字段的最下面
    [CONSTRAINT 约束名] 约束类型(字段名)
    []中的可以省略,默认的约束名为该字段名
    */
    CREATE TABLE stuinfo (
    	id INT,
    	stuName VARCHAR ( 20 ),
    	gender CHAR ( 1 ),
    	seat INT,
    	age INT,
    	majorId INT,
    	CONSTRAINT pk PRIMARY KEY ( id ),#主键
    	CONSTRAINT uq UNIQUE ( seat ),#唯一键
    	CONSTRAINT ck CHECK ( gender = '男' OR gender = '女' ),#检查
    	CONSTRAINT fk_stuinfo_major FOREIGN KEY ( majorId ) REFERENCES major ( id ) #外键
    );
    
    #通用的写法
    CREATE TABLE IF NOT EXISTS stuinfo(
    id int PRIMARY KEY,
    stuName VARCHAR (20) NOT NULL,
    sex CHAR(1),
    age INT DEFAULT 18,
    seat INT UNIQUE,
    majorId INT,
    CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId ) REFERENCES major(id)
    );
    
    #二、修改表添加约束
    /*
    1.添加列级约束
    ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 新约束;
    2.添加表级约束
    ALTER TABLE 表名 add【CONSTRAINT 约束名】 约束类型(字段名) 【外键的引用】
    */
    #1.添加非空约束
    ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL;
    #2.添加默认约束
    ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
    #3.添加主键
    #①列级约束
    ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
    #②表级约束
    ALTER TABLE stuinfo ADD PRIMARY KEY(id);
    #4.添加唯一
    ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
    #②表级约束
    ALTER TABLE stuinfo ADD UNIQUE(id);
    #5.添加外键
    ALTER TABLE stuinfo ADD FOREIGN KEY(majored) REFERENCES major (id);
    
    #三、修改表是删除约束
    #1.删除非空约束
    ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NULL;
    #2.ALTER
    ALTER TABLE stuinfo MODIFY COLUMN age INT;
    #3.删除主键
    ALTER TABLE stuinfo DROP PRIMARY KEY;
    #4.删除唯一
    ALTER TABLE stuinfo DROP INDEX seat;
    #5.删除外键
    ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major; 
    
    #标识列
    /*
    又称为自增长列
    含义:可以不用手动的插入值,系统提供默认的序列值
    
    特点:
    1、标识列必须和主键搭配吗?不一定,但要求是一个key
    2、一个表可以有几个标识列?至多一个
    3、标识列的类型只能是数值型
    4、标识列可以通过 SET auto_increment_increment = 3; 设置如何自增长 3就是在原基础上加3
    */
    
    SHOW VARIABLES LIKE '%auto_increment%';
    SET auto_increment_increment = 3;
    
    #二、修改表时设置标识列
    ALTER TABLE 表名 MODIFY COLUMN 字段名 INT PRIMARY KEY AUTO_INCREMENT;
    #三、修改表时删除标识列
    ALTER TABLE 表名 MODIFY COLUMN 字段名 INT;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值