一、约束的含义:用于限制表中的数据,为了保证表中的数据的准确性和可靠性。
二、添加约束的时机:
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唯一键)

要求插入数据时,先插入主表,再插入从表。

删除数据时,先删从表,再删主表。

先删主表就会报错:

SQL server约束检验 sql 检查约束_外键约束

添加约束例子:

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对主键字段进行覆盖,是删除不了主键的。