六、约束(主键约束、唯一约束、非空约束、检查约束、外键约束)

## 约束,数据类型,触发器
## 保证数据的正确性,完整性,有效性
/*
   主键约束
   唯一约束
   非空约束
   检查约束 (mysql8才有)
   外键约束
   默认值约束     
*/

1.主键约束

## 主键约束: 唯一非空
## 注意: 一张表只能有一个主键约束
##  主键: 单列主键, 组合主键(多列组合形成一个主键)
## 关键字: PRIMARY KEY
## 第一种: 创建表的时候, 列声明后面
DROP TABLE tb_user;
CREATE TABLE tb_user(
  id INT PRIMARY KEY,
  username VARCHAR(30),
  `password` VARCHAR(30),
  age INT
)
INSERT INTO tb_user (id,username, `password`, age) VALUE (1,'zhangsan', '123', 21) ;
INSERT INTO tb_user (id,username, `password`, age) VALUE (1,'李四', '345', 21) ;
## 第一种: 创建表的时候,所有列声明之后,另起一行设置主键约束

CREATE TABLE tb_user(
  id INT,
  username VARCHAR(30),
  `password` VARCHAR(30),
  age INT,
  PRIMARY KEY(id)
)

## 表主键有id,与username共同组合成一个主键

CREATE TABLE tb_user(
  id INT,
  username VARCHAR(30),
  `password` VARCHAR(30),
  age INT,
  PRIMARY KEY(id,username)
)
INSERT INTO tb_user (id,username, `password`, age) VALUE (1,'zhangsan', '123', 21) ;
INSERT INTO tb_user (id,username, `password`, age) VALUE (1,'李四', '345', 21) ;
INSERT INTO tb_user (id,username, `password`, age) VALUE (1,'zhangsan', '44545', 22) ;
##组合主键: PRIMARY KEY(id,username)
## id,与username都一样,才是重复值

CREATE TABLE tb_user(
  id INT,
  username VARCHAR(30),
  `password` VARCHAR(30),
  age INT
)
##第三种写法: 对存在的表,添加主键
## ALTER TABLE 表名 ADD PRIMARY KEY(列名);
ALTER TABLE tb_user ADD PRIMARY KEY(id);
## 主键约束,唯一约束, 把这个约束作为一个索引(提高查询效率)
/*
 主键设置经验:
   1. 主键一般不要设置在有意义的列, 一般都表设置一个id, 作为主键
   2. 修改数据,不会修改主键
*/
## id 一般是数字
## 唯一: mysql提供: 自增列
## 设置自增列   AUTO_INCREMENT
## 创建表的时候, 设置自增列
CREATE TABLE tb_user(
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(30),
  `password` VARCHAR(30),
  age INT
)
#使用: 每次执行insert的时候, 在上一次值加1作为insert插入值
#从1开始
#写insert语句的时候, 自增列不需要手动赋值
INSERT INTO tb_user (username, `password`, age) VALUE ('zhangsan', '123', 21) ;
INSERT INTO tb_user (username, `password`, age) VALUE ('lisi', '123', 21) ;

#如果给自增列手动赋值  id:100
INSERT INTO tb_user (id,username, `password`, age) VALUE (100,'wangwu', '123', 21) ;

## 下一次执行insert, 自增列从 101
INSERT INTO tb_user (username, `password`, age) VALUE ('zhaoliu', '123', 21) ;
## 执行删除操作, 
DELETE FROM tb_user WHERE id = 2;
INSERT INTO tb_user (username, `password`, age) VALUE ('lisisi', '123', 21) ;

DROP TABLE tb_user;
#第二种创建: 对已存在的表添加自增列
CREATE TABLE tb_user(
  id INT PRIMARY KEY ,
  username VARCHAR(30),
  `password` VARCHAR(30),
  age INT
)
ALTER TABLE tb_user CHANGE id id INT  AUTO_INCREMENT;

##删除自增
ALTER TABLE tb_user CHANGE id id INT ;

2.唯一约束

## 唯一约束  关键字: UNIQUE
## 值唯一,允许有一个null
/*
  唯一约束与主键约束的区别:
   1.  唯一约束:值唯一,允许有一个null, 主键约束:值唯一,不允许有null,
   2. 一张表可以有多个唯一约束, 但只能有一个主键约束
*/
CREATE TABLE tb_user(  id INT PRIMARY KEY AUTO_INCREMENT,  username VARCHAR(30) UNIQUE,  `password` VARCHAR(30),  gender VARCHAR(2))INSERT INTO tb_user(username,`password`,gender)VALUES('zhangsan','123','男');INSERT INTO tb_user(username,gender)VALUES('lisi','男');

3.非空约束

## 默认值约束 给某列设置一个默认值
## 关键字: default
## 没有设置默认值, 默认值null
## 关键字: default
## 没有设置默认值, 默认值null
CREATE TABLE tb_user(
  id INT PRIMARY KEY,
  username VARCHAR(30) UNIQUE NOT NULL,
  `password` VARCHAR(30) NOT NULL,
  gender VARCHAR(2) DEFAULT '男'
)
INSERT INTO tb_user(username,`password`,gender)VALUES('zhangsan1','123','女');
INSERT INTO tb_user(username,`password`)VALUES('lisi','123');

4.检查约束

##检查约束 关键字 check  在mysql8才有
## 限制值的范围   check gender='女' or gender='男'

5.外键约束

## 外键: 维护表与表关系,  
##A表与B表的关系, 在B表中添加一列, 引用A表的某列的值
## 添加的一列是外键
## 外键约束: 限制外键的值的范围, 外键列的值的范围, 只能是引用表中引用列的值
## 在互联网开发中, 外键一定有的, 但是外键约束一般不加

 

## 订单表: 
## userId的值必须来源tb_user的id的值
/*
   创建表的时候: 外键取名: fk_表名_列名
   [ CONSTRAINT ] [ 外键名称 ] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
*/
DROP TABLE tb_order; #从表
DROP TABLE tb_user;  #主表
CREATE TABLE tb_order(
 id INT  PRIMARY KEY AUTO_INCREMENT,
 createTime DATETIME,
 price DOUBLE(7,2),
 userId INT,
 CONSTRAINT fk_tb_order_userId FOREIGN KEY(userId) REFERENCES tb_user(id)
)
INSERT INTO tb_order(createtime,price,userId) VALUES('2022-08-12 08:57:43',199,1);

INSERT INTO tb_order(createtime,price,userId) VALUES('2022-08-13 09:57:43',199,3);
/*
  使用外键约束:
   创建表的顺序: 先主表,再从表
   删除表的顺序: 先从表,再主表
   外键约束 引用的主表列必须是主键约束或者是唯一约束
*/
#第二种创建外键约束:
# 对存在的表添加一个外键约束:
#ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ;
CREATE TABLE tb_order(
 id INT  PRIMARY KEY AUTO_INCREMENT,
 createTime DATETIME,
 price DOUBLE(7,2),
 userId INT
)
ALTER TABLE tb_order 
  ADD CONSTRAINT fk_tb_order_userId  FOREIGN KEY(userId)
  REFERENCES tb_user(id);

##外键约束删除数据,修改外键数据的操作
## 删除:
## 删除id为1的用户
## 如果主表这条记录在从表有引用,默认删除失败
DELETE FROM tb_user WHERE id = 1;
/*
NO ACTION: 默认行为 
  当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 
   (与 RESTRICT 一致) 默认行为
CASCADE: 级联删除/修改 
   当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,
   则也删除/更新外键在子表中的记录
 
SET NULL: 
   当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null
   (这就要求该外键允许取null)
*/

##CASCADE:
ALTER TABLE tb_order 
  ADD CONSTRAINT fk_tb_order_userId  FOREIGN KEY(userId)
  REFERENCES tb_user(id) ON UPDATE CASCADE ON DELETE CASCADE;

DELETE FROM tb_user WHERE id = 1;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值