Day03数据库基础之表的约束(not null、unique、primary key、foreign key)

前言

在这里插入图片描述

一、表的约束

1、约束:对表中的数据进行限定,保证数据的完整性、正确性、有效性。
2、分类:
非空约束:not null
主键约束:primary key
唯一约束:unique
外键约束:foreign key

1.非空约束

(1)创建表时添加约束:

create table stu(
	id int,
	name varchar(20) not null -- 添加非空约束
);

(2)创建表完后,添加非空约束:

alter table stu modify name varchar(20) not null;---在Day02中的DDL中有详细说明

(3)删除name的非空约束

alter  table stu modify name varchar(20);

2.唯一约束

(1)创建表时,添加唯一约束(注意:mysql中,唯一约束限定的列的值可以有多个null)

create table stu(
    id int,
    telephone varchar(30) unique
);

(2)创建表后添加唯一约束

alter table stu modify telephone varchar(30) unique;

(3)删除唯一约束

alter table stu drop index telephone;-- 与删除非空约束的方式不一样的 

3.主键约束

1. 含义:非空且唯一
2. 一张表只能有一个字段为主键
3. 主键就是表中记录的唯一标识

(1)创建表时,添加主键约束(主键约束一张表中只有1个,非空且唯一)

create table stu(
    id int primary key,
	name varchar(20)
);

(2)创建表之后添加主键约束

alter table stu modify id int primary key;

(3)删除主键约束

alter table stu drop primary key;

补充:

4.自动增长

如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长

(1) 创建表的时候添加自动增长

 create table stu(
	id int primary key auto_increment,
    name varchar(20)
);
  • 添加自动增长之后,添加数据
insert into stu values(1,'aaa'); 
再添加一行数据
insert into stu values(null,'bbb');-- 此时会在上面的添加数据后面自动增加第2行数据

如图:
在这里插入图片描述

  • 再添加一行数据
insert into stu values(10,'ccc');
  • 此时再用添加一行id为null的数据
insert into stu values(null,'ccc');

这个时候的id自动增加为11了~(自动根据上一行增长,上一行为10,现在添加的自动增加为11)
在这里插入图片描述
(2)创建表后,添加自动增长

ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

(3)删除自动增长

ALTER TABLE stu MODIFY id INT;

5.外键约束

让表与表产生关系,从而保证数据的正确性。

(1)首先我们创建1个员工表emp

CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(30),
	age INT,
	dep_name VARCHAR(30),
	dep_location VARCHAR(30)
);

(2)在emp表中添加一些数据

INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');

运行结果:
在这里插入图片描述


这个emp员工表的缺点是有多个同样的“研发部”和“广州”“深圳”等,会造成数据的冗余,因此为了解决这个缺点,用到了知识点“外键”


外键约束语法:

create table 表名(
....
外键列
constraint 外键约束名称 foreign key (外键列名称) references 主表名称(主表列名称)
);

(1)创建2个表,员工表employee和部门表department;并将两个表添加数据

create table department(  -- 部门表
	id int primary key auto_increment,  -- 主表的主键
	dep_name varchar(20),
	dep_location varchar(20)
);
create table employee( -- 员工表
	id int primary key auto_increment,
	name varchar(20),
	age int,
	dep_id int, -- 外键对应主表的主键
	constraint emp_depid_fk foreign key (dep_id) references department(id)  -- 创建外键约束
);
-- 添加 2 个部门
insert into department values(null, '研发部','广州'),(null, '销售部', '深圳');
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);

用以下的图来帮助理解:
在这里插入图片描述
主表:就是约束别人的表
从表:就是被别人约束的表

(2) 添加完员工表之后,添加外键

alter table employee add constraint emp_depid_fk
foreign key (dep_id) references department(id);

(3)删除外键

alter table employee drop foreign key emp_depid_fk;--emp_depid_fk为外键约束名
-- 创建旅游管理数据库 CREATE DATABASE TravelManagement; GO USE TravelManagement; GO -- 客户表: 存储客户信息 CREATE TABLE Customer ( CustomerID INT IDENTITY(1,1) PRIMARY KEY, -- 主键,自增 Name NVARCHAR(50) NOT NULL, Email NVARCHAR(100) NOT NULL UNIQUE, -- 唯一约束防止重复 Phone NVARCHAR(20), Address NVARCHAR(200) ); -- 行程表: 存储旅游行程信息 CREATE TABLE Tour ( TourID INT IDENTITY(1,1) PRIMARY KEY, -- 主键,自增 Name NVARCHAR(100) NOT NULL, Description NVARCHAR(500), Price DECIMAL(10, 2) NOT NULL CHECK(Price > 0), -- 约束确保价格正数 StartDate DATE, EndDate DATE, Duration AS DATEDIFF(DAY, StartDate, EndDate) + 1 -- 计算字段,持续时间() ); -- 预订表: 存储客户对行程的预订 CREATE TABLE Booking ( BookingID INT IDENTITY(1,1) PRIMARY KEY, -- 主键,自增 CustomerID INT NOT NULL FOREIGN KEY REFERENCES Customer(CustomerID), -- 外键引用Customer TourID INT NOT NULL FOREIGN KEY REFERENCES Tour(TourID), -- 外键引用Tour BookingDate DATE DEFAULT GETDATE(), -- 默认值为当前日期 Status NVARCHAR(20) DEFAULT 'pending' CHECK(Status IN ('pending', 'confirmed', 'cancelled')) -- 状态约束 ); -- 支付表: 存储预订相关的支付信息 CREATE TABLE Payment ( PaymentID INT IDENTITY(1,1) PRIMARY KEY, -- 主键,自增 BookingID INT NOT NULL FOREIGN KEY REFERENCES Booking(BookingID), -- 外键引用Booking Amount DECIMAL(10, 2) NOT NULL, PaymentDate DATE, Status NVARCHAR(20) DEFAULT 'unpaid' CHECK(Status IN ('paid', 'unpaid')) );建立一个完整E-R图
06-05
CREATE TABLE IF NOT EXISTS user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, avatar VARCHAR(255) DEFAULT '/images/default-avatar.jpg', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, role ENUM('ADMIN', 'MEMBER') DEFAULT 'MEMBER', status ENUM('ACTIVE', 'PENDING', 'BLOCKED') DEFAULT 'PENDING' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS activity ( id BIGINT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, description TEXT NOT NULL, start_time DATETIME NOT NULL, end_time DATETIME NOT NULL, location VARCHAR(255), created_by BIGINT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (created_by) REFERENCES user(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS blog ( id BIGINT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, content TEXT NOT NULL, author_id BIGINT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, visibility ENUM('PUBLIC', 'PRIVATE', 'FRIENDS_ONLY') DEFAULT 'PUBLIC', FOREIGN KEY (author_id) REFERENCES user(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS friendship ( user_id BIGINT NOT NULL, friend_id BIGINT NOT NULL, status ENUM('PENDING', 'ACCEPTED', 'BLOCKED') DEFAULT 'PENDING', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (user_id, friend_id), FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE, FOREIGN KEY (friend_id) REFERENCES user(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 这是你之前给出的数据库sql文件
最新发布
06-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值