zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    PAT (Advanced Level) 1010. Radix (25)
    PAT (Advanced Level) 1009. Product of Polynomials (25)
    PAT (Advanced Level) 1008. Elevator (20)
    PAT (Advanced Level) 1007. Maximum Subsequence Sum (25)
    PAT (Advanced Level) 1006. Sign In and Sign Out (25)
    PAT (Advanced Level) 1005. Spell It Right (20)
    PAT (Advanced Level) 1004. Counting Leaves (30)
    PAT (Advanced Level) 1001. A+B Format (20)
    PAT (Advanced Level) 1002. A+B for Polynomials (25)
    PAT (Advanced Level) 1003. Emergency (25)
  • 原文地址:https://www.cnblogs.com/rijiyuelei/p/12380884.html
Copyright © 2011-2022 走看看