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);

 

posted @ 2020-02-28 22:49  风萧萧路漫漫  阅读(266)  评论(0编辑  收藏  举报
// 改变博客标题
浏览器标题切换
浏览器标题切换end