对表里的数据进行限定,保证数据的正确性、有效性和完整性;
①主键约束:primary key
②非空约束:not null
③唯一约束:unique
④外键约束:foreign key
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- 名字不允许为空,否则创建失败
);
注意:
""与NULL是不同的两个概念;
说明链接:https://blog.csdn.net/u014743697/article/details/54136092
-- 删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
-- 创建表之后,添加name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) UNIQUE -- 唯一约束
);
两个NULL值,不算重复;
-- 删除唯一约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
-- 创建表之后,添加name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
①含义:非空且唯一;
②一张表只能有一个主键;
CREATE TABLE stu(
id INT PRIMARY KEY, -- 主键约束
NAME VARCHAR(20)
);
如果某一列是数值类型的,使用auto_increment可以来完成值的自动增长;
CREATE TABLE stu(
id INTPRIMARY KEY AUTO_INCREMENT, -- 主键自动增长
NAME VARCHAR(20)
);
个人理解:加入一个部门的员工表,对于每一个员工在某些字段上存在大量相同的数据,比如有几百名来自同一部门的员工同时都是男性,都是大学生这些相同属性,那么这个时候重复地将一些相同的数据赋值给不同的员工,这样来说浪费了很多内存,那么这样的话就可以建立一个从表,将这些表具有相同值的字段添加进去,主表进行调取即可,这就像是写代码中的定义变量,不需要一次次赋予一样的值。
create table 表名(
...
外键列名称 数据类型,
constraint 外键名称 foreign key (外键列名称) references 从表名称(关联的从表列(一般是主键)名称)
);
-- 创建从表,记录学生的性别和年龄,id自增长
CREATE TABLE stu_p(
id INT PRIMARY KEY AUTO_INCREMENT,
sex VARCHAR(20),
age INT
)
-- 为从表添加记录
INSERT INTO stu_p(id,sex,age) VALUES(1,"男",20);
INSERT INTO stu_p(id,sex,age) VALUES(NULL,"男",21);
INSERT INTO stu_p(id,sex,age) VALUES(NULL,"男",22);
INSERT INTO stu_p(id,sex,age) VALUES(NULL,"女",20);
INSERT INTO stu_p(id,sex,age) VALUES(NULL,"女",21);
INSERT INTO stu_p(id,sex,age) VALUES(NULL,"女",22);
-- 创建主表,记录学生的信息,关联从表里面学生的属性
CREATE TABLE stu(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
ranking INT,
dep_id INT, -- 外键对应的从表的主键(一般都是对应主键)
CONSTRAINT stu_p_id_fk FOREIGN KEY (dep_id) REFERENCES stu_p(id)
)
-- 为主表添加记录
INSERT INTO stu(id,NAME,ranking,dep_id) VALUES(1,"大哥",1,1);
INSERT INTO stu(id,NAME,ranking,dep_id) VALUES(NULL,"二哥",3,2);
INSERT INTO stu(id,NAME,ranking,dep_id) VALUES(NULL,"三哥",2,3);
INSERT INTO stu(id,NAME,ranking,dep_id) VALUES(NULL,"四哥",5,2);
INSERT INTO stu(id,NAME,ranking,dep_id) VALUES(NULL,"大姐",8,1);
INSERT INTO stu(id,NAME,ranking,dep_id) VALUES(NULL,"二姐",44,2);
INSERT INTO stu(id,NAME,ranking,dep_id) VALUES(NULL,"三姐",31,3);
INSERT INTO stu(id,NAME,ranking,dep_id) VALUES(NULL,"四姐",51,3);
-- 查询从表数据
SELECT * FROM stu_p;
-- 查询主表数据
SELECT * FROM stu;
ALTER TABLE 主表名 DROP FOREIGN KEY 外键名称;
ALTER TABLE 主表名 ADD constraint 外键名称 foreign key (外键列名称) references 从表名称(关联的从表列(一般是主键)
ALTER TABLE 主表名
ADD constraint 外键名称
foreign key (外键列名称)
references 从表名称(关联的从表列(一般是主键)
ON UPDATE CASCADE ON DELETE CASCADE;
级联更新:ON UPDATE CASCAD
级联删除:ON DELETE CASCADE