示例:
思考下列哪些数据属于无效数据
数据库完整性是什么
表中数据是否有效、是否正确,需要按照一定的规则对标进行设计,来确保数据的可靠性。防止出现错误的、无效的信息。
定义:数据完整性指数据的正确性和有效性。
数据库完整性的内容
实体完整性
PRIMARY KEY:设置主键约束
UNIQUE KEY: 设置唯一性约束
参照完整性
FIOREIGN KEY: 外键约束
用户定义完整性
DEFAULT: 设置默认值
NOT NULL: 不能为空
完整性约束命名子句
示例
MySQL 数据完整性约束对比表
PRIMARY KEY(主键约束)
作用: 用于唯一标识表中的每一行记录。主键列的值不能重复,也不能为空。
语法示例:
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
Name VARCHAR(50)
);
👉 StudentID
是主键,每个学生必须有唯一的编号。
UNIQUE KEY(唯一性约束)
作用: 确保某一列或多列的值在表中是唯一的,但允许为空(NULL)。
语法示例:
CREATE TABLE Users (
Email VARCHAR(100) UNIQUE,
Username VARCHAR(50)
);
👉 Email
列的值不能重复,但可以有一个 NULL。
FOREIGN KEY(外键约束)
作用: 用于建立两个表之间的关联,确保外键列的值必须存在于另一个表的主键中。
语法示例:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
StudentID INT,
FOREIGN KEY (StudentID) REFERENCES Students(StudentID)
);
👉 Orders
表中的 StudentID
必须在 Students
表中存在。
DEFAULT(默认值约束)
作用: 当插入数据时,如果没有提供该列的值,自动使用默认值。
语法示例:
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
Status VARCHAR(20) DEFAULT 'On Sale'
);
👉 若未指定 Status
,系统会自动填入 'On Sale'
。
NOT NULL(非空约束)
作用: 规定某一列的值不能为空(即必须有值)。
语法示例:
CREATE TABLE Employees (
EmpID INT PRIMARY KEY,
Name VARCHAR(50) NOT NULL
);
👉 插入数据时必须为 Name
提供一个值,否则会报错。
CREATE TABLE scores3(
id tinyint unsigned PRIMARY KEY,
name varchar(50) NOT NULL,
age tinyint unsigned,
chinese tinyint unsigned DEFAULT 0,
math tinyint unsigned DEFAULT 0,
english tinyint unsigned DEFAULT 0
);
--插入数据
INSERT INTO scores2(id)
VALUES
(1);
INSERT INTO scores2(name,id)
VALUES
("张三",1);
INSERT INTO scores3(name,id,age,chinese,english)
VALUES
("张三",2,17,80,99);
-- 添加一列身份证号(不能重复)
CREATE TABLE scores4(
id tinyint unsigned PRIMARY KEY,
name varchar(50) NOT NULL,
age tinyint unsigned,
id_num char(18) UNIQUE KEY,
chinese tinyint unsigned DEFAULT 0,
math tinyint unsigned DEFAULT 0,
english tinyint unsigned DEFAULT 0
);
-- 插入数据
INSERT INTO scores4(name,id,age,id_num,chinese,english)
VALUES
("李四",3,17,123456789987654322,80,99);
练习
9月21日 完整性约束练习题
1. 学生信息表 (StudentInfo)
创建学生表,包含:
学号 (student_id)(主键,不能为空)
姓名 (name)(不能为空)
年龄 (age)(默认值为18)
班级 (class)(不能为空)
入学时间 (enrollment_time)(默认值为当前时间)
2. 商品信息表 (ProductInfo)
创建商品表,包含:
商品编号 (product_id)(主键,不能为空)
商品名称 (product_name)(不能为空)
价格 (price)(默认值为0)
库存数量 (stock_quantity)(默认值为0)
上架状态 (listing_status)(默认值为'未上架')
3. 员工基本信息表 (EmployeeInfo)
创建员工表,包含:
工号 (employee_id)(主键,不能为空)
姓名 (name)(不能为空)
部门 (department)(默认值为'未分配')
职位 (position)(不能为空)
邮箱 (email)(唯一约束)
4. 图书信息表 (BookInfo)
创建图书表,包含:
图书编号 (book_id)(主键,不能为空)
图书名称 (book_name)(不能为空)
作者 (author)(默认值为'未知')
出版社 (publisher)(不能为空)
出版日期 (publish_date)(默认值为当前日期)
5. 用户账户表 (UserAccount)
创建用户表,包含:
用户ID (user_id)(主键,不能为空)
用户名 (username)(不能为空且唯一)
密码 (password)(不能为空)
注册时间 (register_time)(默认值为当前时间)
账户状态 (account_status)(默认值为'正常')
6. 课程信息表 (CourseInfo)
创建课程表,包含:
课程编号 (course_id)(主键,不能为空)
课程名称 (course_name)(不能为空且唯一)
学分 (credits)(默认值为2)
课时数 (class_hours)(默认值为32)
开课状态 (course_status)(默认值为'未开课')
7. 订单基本信息表 (OrderInfo)
创建订单表,包含:
订单编号 (order_id)(主键,不能为空)
客户姓名 (customer_name)(不能为空)
订单金额 (order_amount)(默认值为0)
订单状态 (order_status)(默认值为'待处理')
下单时间 (order_time)(默认值为当前时间)
8. 部门信息表 (DepartmentInfo)
创建部门表,包含:
部门编号 (department_id)(主键,不能为空)
部门名称 (department_name)(不能为空且唯一)
部门主管 (department_manager)(默认值为'暂未分配')
成立时间 (establish_time)(默认值为当前时间)
部门状态 (department_status)(默认值为'启用')
9. 产品类别表 (ProductCategory)
创建类别表,包含:
类别编号 (category_id)(主键,不能为空)
类别名称 (category_name)(不能为空且唯一)
类别描述 (category_description)(默认值为'暂无描述')
创建时间 (create_time)(默认值为当前时间)
排序号 (sort_order)(默认值为0)
10. 系统日志表 (SystemLog)
创建日志表,包含:
日志编号 (log_id)(主键,不能为空)
操作内容 (operation_content)(不能为空)
操作人员 (operator)(默认值为'系统')
操作时间 (operation_time)(默认值为当前时间)
操作结果 (operation_result)(默认值为'成功')
参考答案
1. 学生信息表 (StudentInfo)
CREATE TABLE 学生信息 (
学号 INT PRIMARY KEY NOT NULL,
姓名 VARCHAR(50) NOT NULL,
年龄 INT DEFAULT 18,
班级 VARCHAR(50) NOT NULL,
入学时间 DATETIME DEFAULT CURRENT_TIMESTAMP
);
2. 商品信息表 (ProductInfo)
CREATE TABLE 商品信息 (
商品编号 INT PRIMARY KEY NOT NULL,
商品名称 VARCHAR(100) NOT NULL,
价格 DECIMAL(10,2) DEFAULT 0,
库存数量 INT DEFAULT 0,
上架状态 VARCHAR(20) DEFAULT '未上架'
);
3. 员工基本信息表 (EmployeeInfo)
CREATE TABLE 员工信息 (
工号 INT PRIMARY KEY NOT NULL,
姓名 VARCHAR(50) NOT NULL,
部门 VARCHAR(50) DEFAULT '未分配',
职位 VARCHAR(50) NOT NULL,
邮箱 VARCHAR(100) UNIQUE
);
4. 图书信息表 (BookInfo)
CREATE TABLE 图书信息 (
图书编号 INT PRIMARY KEY NOT NULL,
图书名称 VARCHAR(100) NOT NULL,
作者 VARCHAR(50) DEFAULT '未知',
出版社 VARCHAR(100) NOT NULL,
出版日期 DATE DEFAULT CURRENT_DATE
);
5. 用户账户表 (UserAccount)
CREATE TABLE 用户账户 (
用户ID INT PRIMARY KEY NOT NULL,
用户名 VARCHAR(50) NOT NULL UNIQUE,
密码 VARCHAR(100) NOT NULL,
注册时间 DATETIME DEFAULT CURRENT_TIMESTAMP,
账户状态 VARCHAR(20) DEFAULT '正常'
);
6. 课程信息表 (CourseInfo)
CREATE TABLE 课程信息 (
课程编号 INT PRIMARY KEY NOT NULL,
课程名称 VARCHAR(100) NOT NULL UNIQUE,
学分 INT DEFAULT 2,
课时数 INT DEFAULT 32,
开课状态 VARCHAR(20) DEFAULT '未开课'
);
7. 订单基本信息表 (OrderInfo)
CREATE TABLE 订单信息 (
订单编号 INT PRIMARY KEY NOT NULL,
客户姓名 VARCHAR(50) NOT NULL,
订单金额 DECIMAL(10,2) DEFAULT 0,
订单状态 VARCHAR(20) DEFAULT '待处理',
下单时间 DATETIME DEFAULT CURRENT_TIMESTAMP
);
8. 部门信息表 (DepartmentInfo)
CREATE TABLE 部门信息 (
部门编号 INT PRIMARY KEY NOT NULL,
部门名称 VARCHAR(50) NOT NULL UNIQUE,
部门主管 VARCHAR(50) DEFAULT '暂未分配',
成立时间 DATETIME DEFAULT CURRENT_TIMESTAMP,
部门状态 VARCHAR(20) DEFAULT '启用'
);
9. 产品类别表 (ProductCategory)
CREATE TABLE 产品类别 (
类别编号 INT PRIMARY KEY NOT NULL,
类别名称 VARCHAR(50) NOT NULL UNIQUE,
类别描述 VARCHAR(200) DEFAULT '暂无描述',
创建时间 DATETIME DEFAULT CURRENT_TIMESTAMP,
排序号 INT DEFAULT 0
);
10. 系统日志表 (SystemLog)
CREATE TABLE 系统日志 (
日志编号 INT PRIMARY KEY NOT NULL,
操作内容 VARCHAR(200) NOT NULL,
操作人员 VARCHAR(50) DEFAULT '系统',
操作时间 DATETIME DEFAULT CURRENT_TIMESTAMP,
操作结果 VARCHAR(20) DEFAULT '成功'
);
##