一、约束的含义:用于限制表中的数据,为了保证表中的数据的准确性和可靠性。
二、添加约束的时机:
1.创建表时
2.修改表时
三、常见约束:
1.NOT NULL,用于保证该字段的值不能为空,比如姓名,学号等等
2.DEFAULT,保证添加字段值具有默认值,比如性别啥的
3.PRIMARY KEY,保证添加约束的字段值具备唯一性,并且非空。
4.UNIQUE,唯一约束,用于保障字段值的唯一性,可以为空。
5.CHECK,检查约束【MySQL不支持】
6.FOREIGN KEY,外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表添加外键约束,用于引用主表中的值。
四、添加的分类:
列级约束:六大约束在语法上都支持,但是外键约束没有效果
表级约束:除了非空和默认,其他的都可以
五、添加的方式:
1.建表时创建
CREATE 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
【CONSTRAINT 约束名】约束类型 (约束列) 【REFERENCES 表名(列名)(只有添加外键的时候使用REFERENCES)】
对于约束来说,即使不起约束名,也会自动默认为约束列的名,主键的名字就是PRIMARY);
设置主键时,即使甚至了主键名也没用,主键名就是PRIMARY
2.修改表时添加约束(修改约束)
添加列級約束
ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 新约束;
ALTER TABLE 表名 CHANGE 表名 表名 整型 要添加的新约束名;
添加表级约束
ALTER TABLE 表名 ADD 【CONSISTENT 约束名】 约束类型 (字段名);
例子:
#1.添加列级约束
create DATABASE students;
USE students;
CREATE TABLE s_test
( id INT PRIMARY KEY,
stuName VARCHAR(20) not null,
gender char CHECK(gender=‘男’or’女’)#mysql中不支持,
seat int unique,
age int DEFAULT 18,#默认约束
majorId INT
);
#1.表级约束
CREATE TABLE s_biaojiyueshu
( id INT ,
stuName VARCHAR(20) ,
gender char(1) ,
seat int ,
age int ,
majorId INT,
CONSTRAINT pk PRIMARY KEY (id),
CONSTRAINT uq UNIQUE (seat),
CONSTRAINT fk FOREIGN KEY(majorId) references test_001(id));
#通用的写法:
CREATE TABLE studio(
id INT PRIMARY KEY,
stuname VARCHAR(20) not null,
sex CHAR ,
age int DEFAULT 18,
set
int UNIQUE ,
majorId INT,
CONSTRAINT fk_studio_test_001 FOREIGN KEY (majorId) REFERENCES test_001(id)
);
create table test_001(
id int PRIMARY KEY,
majorName VARCHAR(20)
);
SHOW INDEX FROM studio;#使用SHOW INDEX FROM 表名 查询表中的键(主键、外键、唯一键),如果不设置键名的话,主键默认键名为PRIMARY,外键和唯一键的默认键名是对应列名
主键和唯一的对比:
1.都具有唯一性
2.主键不允许为空吗,但是unique允许为空。
3.一个表只能有一个主键,一个表中可以有多个唯一键。
4.都允许复合,所谓复合就是一表中的主键由多个字段共同组成,各个字段的值都可以重复,但是组合出的值不能重复。
外键:
要求在从表上设置外键关系
从表的外键列的类型和主表的关联列的类型一致或者兼容。
主表中的关联列必须是一个键(主键or唯一键)
要求插入数据时,先插入主表,再插入从表。
删除数据时,先删从表,再删主表。
先删主表就会报错:
添加约束例子:
CREATE TABLE test
( id INT ,
stuName VARCHAR(20) ,
gender char(1) ,
seat int ,
age int ,
majorId INT);
#1.添加主键
ALTER TABLE test MODIFY COLUMN id INT PRIMARY KEY;
ALTER TABLE test CHANGE id id INT PRIMARY KEY
#2.添加主键
ALTER TABLE test ADD PRIMARY KEY (id);
#3.添加默认约束
ALTER TABLE test MODIFY COLUMN age INT test001 DEFAULT 18;
ALTER TABLE test DROP DEFAULT;
#4.添加非空约束
ALTER TABLE test MODIFY COLUMN majorId INT NOT NULL;
#5.添加唯一
ALTER TABLE MODIFY COLUMN seat UNIQUE;
ALTER TABLE test add UNIQUE(seat);
#6.添加外键,外键不能不是列级约束,使用modify进行添加没用的。
alter table test add CONSTRAINT fk_aasda FOREIGN KEY(age) REFERENCES test_001(id)
;
ALTER TABLE test DROP FOREIGN KEY fk_aasda;
六、删除约束
DROP TABLE t_drop;
CREATE table t_drop(
p_id int PRIMARY key,
p_name varchar(20) NOT null,
S_id int UNIQUE,
gender char DEFAULT ‘男’,
major_id int,
CONSTRAINT fk_t_drop_major FOREIGN KEY (major_id) REFERENCES major(id)
);
CREATE table major(
id INT PRIMARY KEY
);
关于约束的删除的需要注意的是,可以使用drop对有名字的约束进行删除,对于没有名的则要使用modify进行覆盖,不过对于删除主键来说,即使使用drop删除了主键,还有一个not null约束需要删除,需要使用modify再覆盖一遍,而且直接使用modify是无效IDE,删除不了主键
对使用键名进行删除时,主键使用PRIMARY KEY,外键使用FOREIGN KEY,唯一键是用INDEX;
ALTER TABLE 表名 DROP 键的类型 键名(删除主键是不需要使用键名);
ALTER TABLE 表名 MODIFY 表名 类型
#使用modify对主键字段进行覆盖,是删除不了主键的。