• DDL-约束


    ALTER 改变

    TABLE 表

    MODIFY:更改

    COLUMN :列

    CONSTRAINT:约束

    REFERENCES:参考

    REFERENCES 引用的表(列名)

    常见约束

    约束名不可以重复
    控制某个字段
    含义:一种限制,用于限制表中的数据,为了保证表中数据的准确和可靠性(一致性)

    分类:六大约束

    nut null 非空 保证该字段的值不能为空。例如:姓名,学号
    default 默认 保证该字段有默认值。例如:性别
    primary key 主键 保证该字段的唯一性,并且非空。例如:学号、员工编号
    unique 唯一 保证该字段的值具有唯一性,可以为空。例如:作为号
    check 检查约束

    添加条件【MySQL不支持】(拆k)

    例如:性别设置为char(1),可以填男女,也可以是任何一个字符,这时候就需要check

    年龄也是

    foreign key 外键

    用于限制两个表的关系。保证该字段的值必须来自于主表的关联列的值

    在从表添加约束,用于限制主表中某列的值,类型必须一致,或者能够隐式的转换

    例如:学生表的专业编号,员工的部门编号,员工表的工种编号

    添加约束的时机:数据添加之前

    1.创建表
    2.修改表

     一个列可以添加多个约束 空格隔开后 加就行了

    约束的添加分类

    列级约束:直接写在列的后面,不支持起名字
         语法上六大约束都支持,但外键没有效果
         只支持:默认、非空、主键、唯一

    表级约束:写在最后(逗号隔开),支持起名字。主键名字固定起了也没用
         除了非空、默认,其他的都支持。
         只支持:主键、唯一、外键

      位置 支持的约束类型 是否可以起约束名
    列级约束 列的后面 语法都支持,但外键没有效果 不可以
    表级约束 所有列的后面 不支持默认、非空,其他的支持 可以,但对主键没有效果

    列级约束可以在字段后 追加多个,之间用空格隔开,部分顺序

    主键vs唯一

      唯一性 是否容许为空  一个表中可以有多少个  两个列组合为一个
    主键 ×  最多一个,也可以没有  √不推荐
    唯一 √  可以有多个  √不推荐

    注意:
    唯一:只能有一个为空,多一个报错
    组合:两个有一个不一样就可以,两个都一样报错。

    外键的特点:
    ①要求在从表设置外键关系(主表是被引用的)
    ②从表的外键列的类型,要和主表关联列的类型,一致或兼容(可以隐式的转换),意思也一样,名称无所谓
    ③主表的关联列必须是一个key(一般是:主键、唯一),外键就没有意义了唯一不重复的引用才有意义
    ④插入数据时先插入主表,再插入从表
    删除数据时先删除从表,在删除主表

    ①创建表时 

    #语法
    /*
    CREATE TABLE 表名(
    字段名 字段类型 列级约束,
    字段名 字段类型 列级约束,
    )
    */
    
    #创建数据库
    CREATE DATABASE stu;
    
    #打开数据库
    USE stu;
    
    #创建表
    CREATE TABLE stuinfo(
    id INT PRIMARY KEY,#主键
    stuName VARCHAR(20) NOT NULL,#非空
    gender CHAR(1) CHECK(gender IN('','')),#检查
    seat INT UNIQUE,#唯一
    age INT DEFAULT 18,#默认约束
    majorID INT REFERENCES major(id)#外键
    );
    #REFERENCES(瑞符瑞c子)
    
    CREATE TABLE major(
    id INT PRIMARY KEY,
    majorName VARCHAR(20)
    );
    
    #查看表的结构
    DESC stuinfo;
    
    #key索引
    
    #查看表中的索引:主键、外键、唯一键
    SHOW INDEX FROM stuinfo;
    
    /*
    TABLE哪个表
    non_unique是否唯一 0唯一,其他非
    key_name索引的名字
    seq_in_index序列值
    column_name哪个列
    主键、外键、唯一键,都会自动生成索引
    主键名是固定的,改名也没效果(MySQL是这样的,SqlServer和Oracle有效果)
    
    其他的看不了,需要搭配desc使用查看约束
    */
    
    #删除表
    DROP TABLE if EXISTS stuinfo;

     表级约束

    #语法
    /*
    CREATE TABLE 表名(
    字段名 字段类型,
    字段名 字段类型,
    【CONSTRAINT(康死吹t)  约束名(自定义)】 约束的类型(列名),
    外键:【CONSTRAINT(康死吹t)  外键的约束名(自定义)】 约束的类型(列名) REFERENCES 表(列名)
    )
    主键名字固定,自定义不了
    */
    
    #创建表
    CREATE TABLE stuinfo(
    id INT,
    stuName VARCHAR(20),
    gender CHAR(1),
    seat INT,
    age INT,
    majorid INT,
    CONSTRAINT pk PRIMARY KEY(id),#主键
    CONSTRAINT up UNIQUE(seat),#唯一键
    CONSTRAINT ck CHECK(gender in('','')),#检查
    CONSTRAINT fk_stuinfo_majorid FOREIGN KEY(majorid) REFERENCES major(id)#外键
    );
    #查看表中的索引
    SHOW INDEX FROM stuinfo;
    
    #删除表
    DROP TABLE if EXISTS stuinfo;
    #创建表
    CREATE TABLE stuinfo(
    id INT,
    stuName VARCHAR(20),
    gender CHAR(1),
    seat INT,
    age INT,
    majorid INT,
    PRIMARY KEY(id),#主键
    UNIQUE(seat),#唯一键
    CHECK(gender in('','')),#检查
    FOREIGN KEY(majorid) REFERENCES major(id)#外键
    );
    #查看表中的索引
    SHOW INDEX FROM stuinfo;
    
    #通用的写法:主键,唯一键列级,外键表级
    CREATE TABLE IF NOT EXISTS stuinfo(
    id INT PRIMARY KEY,#主键
    stuName VARCHAR(20) NOT NULL,#非空
    gender CHAR(1),
    seat INT UNIQUE,#唯一
    age INT DEFAULT 18,#默认约束
    majorid INT,
    CONSTRAINT fk_当前表名_主表名 FOREIGN KEY(为谁设置) REFERENCES 引用主表(的列)
    );
    
    #创建表
    CREATE TABLE IF NOT EXISTS stuinfo(#IF EXISTS有 IF NOT EXISTS没有
    id INT PRIMARY KEY,#主键
    stuName VARCHAR(20) NOT NULL,#非空
    gender CHAR(1),
    seat INT UNIQUE,#唯一
    age INT DEFAULT 18,#默认约束
    majorid INT,
    CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
    );
    #查看表中的索引
    SHOW INDEX FROM stuinfo;

    ②修改表时

    /*
    1.添加列级约束
    ALTER TABLE 表名 MODIFY COLUMN 列名 类型 新约束;
    
    2.添加表级约束
    ALTER TABLE 表名 ADD 【CONSTRAINT 约束别名】 约束类型(列名)【REFERENCES 表名(列名)】;
    
    */
    #创建表
    CREATE TABLE stuinfo(
    id INT,
    stuName VARCHAR(20),
    gender CHAR(1),
    seat INT,
    age INT,
    majorid INT
    )
    
    #删除表
    DROP TABLE if EXISTS stuinfo;
    
    #1.添加非空约束(不是添加,是修改,和修改列的类型一样,直接在后面加)
    改变 表 表名 更改 列 列名 类型(长度) 约束
    ALTER TABLE stuinfo MODIFY COLUMN stuName  VARCHAR(20) NOT NULL;
    #删除的时候不写,或者把not删掉
    
    #查看表的结构
    DESC stuinfo
    
    #2.添加默认约束
    ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 19;
    
    #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(seat);
    
    #5.添加外键:有两种 但是列级没效果
    #方式二:表级约束
    ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);
    
    #方式二:加别名,没有就使用默认的
    ALTER TABLE stuinfo ADD CONSTRAINT fk_majorid_major FOREIGN KEY(majorid) REFERENCES major(id);
    # 改变 表 表名 添加 【约束 约束名】 主键(列名);

    ③修改表时删除约束

    #1.删除非空约束:不写就行了
    ALTER TABLE stuinfo MODIFY COLUMN stuName  VARCHAR(20);
    改变 表 stuinfo 更改 列 stuName
    
    #2.删除默认约束:不写就行了
    ALTER TABLE stuinfo MODIFY COLUMN age INT;
    
    #3.删除主键:因为主键支持列级约束和表级约束
    #方式一:列级约束:不写就行了
    ALTER TABLE stuinfo MODIFY COLUMN id INT;
    #方式二:表级约束:ALTER TABLE 表名 DROP PRIMARY KEY(直接指明主键);
    ALTER TABLE stuinfo DROP PRIMARY KEY;
    
    #查看表中索引
    SHOW INDEX FROM stuinfo; 
    
    #4.删除唯一键:ALTER TABLE 表名 DROP INDEX 索引名;
    ALTER TABLE stuinfo DROP INDEX seat;
    
    #5.删除外键:ALTER TABLE 表名 DROP FOREIGN KEY 索引名;
    ALTER TABLE stuinfo DROP FOREIGN KEY fk_majorid_major;

    练习

    #1.向表emp2的id列中添加 PRIMARY KEY 的约束(my_emp_id_pk)
    ALTER TABLE emp2 MODIFY id INT PRIMARY KEY;
    
    
    #使用表级约束,取了也没效果主键名固定的
    ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pk PRIMARY KEY(id);
    # 改变 表 表名 添加 【约束 约束名】 主键(列名);
    
    #2.向表emp2中添加dept_id,并在其中自定义PRIMARY KEY约束,与之前相关联的列是dept2表中的id列
    ALTER TABLE emp2 ADD COLUMN dept_id INT;
    ALTER TABLE emp2 FOREIGN KEY(dept_id) REFERENCES dept2(id);
  • 相关阅读:
    设计模式
    IPC- Posix与system v
    squashfs文件系统
    各种根文件系统
    SPI通讯协议
    tty各种设备的情况
    Linux系统调用过程
    uImage和zImage的区别
    jquery可见性选择器(匹配匹配所有显示的元素)
    jquery可见性选择器(匹配所有隐藏的元素)
  • 原文地址:https://www.cnblogs.com/rijiyuelei/p/12380884.html
Copyright © 2020-2023  润新知