103 - Lecture 3

SQL - Table and Data Part 2

一、Table Constraints

Table constraints can be defined when creating tables.

But you can also add constraints to an existing table.

1. Syntax of Constraints

• General Syntax:

CONSTRAINT name TYPE details;

• 约束名称是为了以后可以通过该名称删除(removed)约束而创建的。

• 如果没有提供名称,将自动生成(generated)一个名称。

MySQL provides the following constraint types:

• PRIMARY KEY

• UNIQUE

• FOREIGN KEY

• CHECK

• INDEX

2. CHECK Constraint

• 通过添加 CHECK 约束可以限制属性的可能值。(limit the possible values of an attribute) 

Example:


 

CREATE TABLE People(id INTERGER PRIMARY KEY,name VARCHAR(100) NOT NULL,CONSTRAINT id_positive CHECK (id > 0)
); 

3. UNIQUE Constraint

• 一个表可以定义多个(multiple) UNIQUE 键。

CONSSTRAINT name UNIQUE (col1,col2,……)

组合唯一键(如 (a, b, c)):

Composite unique key 

• 列 a、b 和 c 的组合必须唯一,但单独的列值(individual column)可以重复。

单独唯一键(如 (a)、(b) 和 (c)):

Separate unique keys 

• 每个单独的列不允许重复。( duplicates)

4. Primary Key

• 主键约束名称在 MySQL 中被忽略,但在其他数据库中有效。

• 主键列的值不能为空。

• 一个表只能有一个主键。

Only one primary key is allowed for a table.

CONSTRAINT name PRIMARY KEY(col1,col2……)

示例

Example:

CREATE TABLE Branch (branchNo CHAR(4),street VARCHAR(100),city VARCHAR(25),postcode VARCHAR(7),CONSTRAINT branchUnique UNIQUE(postcode),CONSTRAINT branchPKPRIMARY KEY (branchNo)
);

alternative way

CREATE TABLE Branch2 (branchNo CHAR(4) PRIMARY KEY,street VARCHAR(100),city VARCHAR(25),postcode VARCHAR(7) UNIQUE
);

The primary key and unique key will automatically be assigned with constraint names

Question

(1). (Col1):合法,因为 Col1 中的值都是唯一的,没有重复。

(2). (Col4):不合法,因为 Col4 中的值有重复(4 出现了三次)。

(3). (Col1, Col4):合法,组合后的值是唯一的。

(4). (Col2, Col1):合法,组合后的值是唯一的。

(5). (Col2, Col3):不合法,因为 (NULL, 2) 和 (NULL, 5) 组合后有重复,NULL 无法唯一标识。

(6). (Col3, Col4):合法,组合后的值是唯一的。

CREATE TABLE room_booking (booking_time DATETIME,room_number INT,guest_id VARCHAR(100),comments TEXT,PRIMARY KEY (booking_time, guest_id)
);

CREATE TABLE room_booking (booking_time DATETIME,room_number INT,guest_id VARCHAR(100),comments TEXT,CONSTRAINT pk_room_booking PRIMARY KEY (booking_time, guest_id)
);

二、Foreign Key

 外键包括以下部分:(consists of the following parts)

约束名称。A constraint name.

引用表的列。Columns of the referencing table.

被引用的表和列。Referenced table and referenced columns.

引用选项(如 ON DELETE 和 ON UPDATE)。

Reference options 

1. Syntax:

2. Foreign Key Important Notice

(1) 外键必须引用唯一键(unique key)或主键。

(2) 列表必须用括号括起来。

Column list must be enclosed with brackets.

(3)两列的数据类型必须兼容。

Data types of both columns must be compatible.

​​​​​​​

• 应用外键约束后,`staff`. `branchNo`(the branchNo column of table staff) 列的值将由数据库检查,确保它们是:

• `branch`.`branchNo` 表中的现有值(existing value), 或者 NULL。

CREATE TABLE P(Col4 INT,Col5 INT,Col6 INT,CONSTRINT PK_4_5 PRIMARY KEY (Col4,Col5)
);CREATE TABLE T(Col1 INT,Col2 INT,Col3 INT,CONSTRINT FK_T_2_3 FOREIGN KEY(Col1,Col2)REFERENCESP(Col4,Col5)
);

• 可插入的元组为那些 branchNo 存在于 branch 表中,或 branchNo 值为 NULL 的元组。

The tuples that can be inserted are those where branchNo exists in the branch table or branchNo is NULL.

Q2:

• ('S5', 'staff5', NULL):NULL 值允许存在于外键中,因为它表示无引用。

不能插入的元组

• ('S2', 'staff2', 'B007'):B007 不在 branch 表中,因此会违反外键约束。

Q3:

• 在 Branch 表中,branchNo 是主键,因此它必须唯一。只有 B007 不存在于 Branch 表中,因此可以插入。

在这个实验问题中,我们需要将一些元组插入到 staff 表中,并检查插入操作是否会导致错误。右侧的 branch 表提供了 branchNo 列的有效值,staff 表中的 branchNo 列有一个外键约束,要求它引用 branch 表中的 branchNo 列。这意味着 staff 表中插入的 branchNo 值必须在 branch 表中存在,或者为 NULL,否则会导致外键约束错误。

• 插入 b001 会触发外键约束错误,因为 MySQL 默认不区分大小写,但外键引用需要严格匹配 branch 表中的值。

• 插入 B007 会触发外键约束错误,因为 B007 不存在于 branch 表中。

3. MySQL: String Comparison

• 在 MySQL 中,字符串比较不区分大小写。(case-insensitive),

• 例如,插入 B001 和 b001 会违反主键约束。

 violate the primary key constraint.

解决方案:使用 BINARY 关键字,使比较区分大小写。

4. The BINARY Keyword

• BINARY 关键字指示 MySQL 按字符串的 ASCII 值进行比较,而不仅仅是字母。

The BINARY keyword instructs MySQL to compare the characters in the string using their underlying ASCII values rather than just their letters.

• In other databases, string comparison can be implemented differently.

CREATE TABLE `branch` (`branchNo` char(4) BINARY NOT NULL,PRIMARY KEY(`branchNo`),
);

三、Reference Options

add non-existing branchNo to Staff were rejected by DBMS.

What happens when we change/delete existing branchNo in Branch that are being referenced bt Staff. 

1. RESTRICT

阻止用户删除或更新外键约束的值。under foreign key constraints.

2. CASCADE

允许更改传播到引用的表。Allow the changes to flow on to the referenced table.

在删除或更新父记录时自动删除或更新子表中相关记录的情况

3. SET NULL

将引用的值设置为 NULL。Set referencing values to NULL.

当删除或更新父表中的记录时,可以选择将子表中对应的外键值设置为 NULL,前提是外键列允许 NULL 值。

4. SET DEFAULT

将引用的值设置为列的默认值。 Set referencing values to the default value for their column.

当删除或更新父表中的记录时,可以选择将子表中对应的外键值设置为预定义的默认值。

• ON DELETE – What will happen if referenced values are deleted.

• ON UPDATE – What will happen if referenced values are updated

CREATE TABLE branch (branchNo CHAR(4)PRIMARY KEY
);CREATE TABLE staff(staffID CHAR(2),staffName VARCHAR(50),branchNo CHAR(4),FORIGN KEY (branchNo) REFERENCE branch(branchNo)ON DELETE SET NULLON UPDATE CASCADE
);

注意

• 只有整个 CREATE TABLE 语句的最后需要一个分号 ;

• 在外键约束内部的各行不需要添加分号,否则会导致语法错误。

EX:

四、Altering Tables

添加列

1. Add Column:

ALTER TABLE table_nameADD column_name datatype [options like UNIQUE];

删除列

2. Drop Column:

ALTER TABLE table_baneDROP COLUMN column_name;

修改列名和定义

3. Modify Column Name and Definition:

ALTER TABLE table_nameCHANGE COLUMNcol_name new_col_name datatype [col_options];

ALTER 语句通常用于在表已经创建好之后进行修改,因此它通常不会在 CREATE 语句中使用

整个语句最后需要一个分号 ; 来表示 SQL 语句的结束。

EX:

ALTER TABLE staff ADD `IName` VARCHAR(20) NOT NULL;ALTER TABLE staff DROP COLUMN `IName`;ALTER TABLE staff CHANGE COLUMN `fName``first_name` VARCHAR(20) NOT NULL;ALTER TABLE staff MODIFY COLUMN`first_name` VARCHAR(40)_ NOT NULL;

4. Adding Constraints

ALTER TABLE table_nameADD CONSTRAINT name definition;

EX:

ALTER TABLE branchADD CONSTRAINT ck_branch UNIQUE (street);ALTER TABLE staff ADD CONSTRAINT fk_staff_staffFOREIGN KEY (branchNo) REFERENCES branch (branchNo);

5. Removing Constraints

DROP INDEX:当添加一个唯一键时,数据库会自动创建一个唯一索引来支持这个唯一性约束。因此,删除唯一键约束时,通常也可以通过删除唯一索引来实现。

DROP CHECK:删除表中的检查约束(CHECK constraint)

EX:

ALTER TABLE staff DROP PRIMARY KEY;ALTER TABLE staff DROP FORIGN KEY fk_staff_staff;ALTER TABLE branch DROP INDEX ck-branch;
CREATE TABLE employees (employee_id INT PRIMARY KEY,salary DECIMAL(10, 2),CONSTRAINT chk_salary CHECK (salary > 0)
);ALTER TABLE employees DROP CHECK chk_salary;ALTER TABLE employees DROP PRIMARY KEY;

五、Deleting Tables

• 可以使用 DROP 关键字删除表。

• 删除的表及其中的所有数据将被永久删除,且无法撤销。

Dropped tables and all data within them will be permanently deleted and cannot be undone.

• Tables will be dropped in that exact order

• All tuples in the dropped tables will be deleted as well.

Example:

DROP TABLE [IF EXITS] table-name1,table-name2……;

• Foreign Key constraints will prevent DROPS under the default RESTRICT option, to overcome this:

(1) Remove the foreign key constraints first then drop the tables.

先移除外键约束,然后再删除表。

(2)Drop the tables in the correct order (referencing table first).

按正确的顺序删除表(先删除引用的表)。

(3) Turn off foreign key check temporarily.

临时关闭外键检查。

-- 关闭外键检查
SET FOREIGN_KEY_CHECKS = 0;-- 进行需要的操作,比如删除表或插入数据-- 重新开启外键检查
SET FOREIGN_KEY_CHECKS = 1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/3823.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

前端 算法 双指针

文章目录 三数之和移动零盛最多水的容器接雨水 三数之和 leetcode 三数之和 题目链接 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有…

nuPlan最新SOTA,香港科技大学发布基于学习决策范围内的规划PlanScope

nuPlan最新SOTA,香港科技大学发布基于学习决策范围内的规划PlanScope Abstract 在自动驾驶的背景下,基于学习的方法在规划模块的开发中表现出了很大的潜力。在规划模块的训练过程中,直接最小化专家驾驶日志与规划输出之间的差异是一种广泛采…

MATLAB实现人工免疫网络算法(Artificial Immune Network Algorithm, AINA)

1. 免疫网络算法简介 生物免疫系统是自然界中最复杂、最有效的自适应系统之一,它能够识别并清除入侵的病原体,同时保持对自身细胞的忍耐。免疫网络算法是一种借鉴生物免疫系统原理和机制的计算模型 2.算法流程 3.MATLAB代码 完整代码见: https://down…

MySQL初学之旅(1)配置与基础操作

目录 1.前言 2.正文 2.1数据库的发展历程 2.2数据库的基础操作 2.2.1启动服务 2.2.2创建与删除数据库 2.2.3数据类型 2.2.4创建表与删除表 2.3MySQL Workbench基础使用简介 3.小结 1.前言 哈喽大家好吖,今天博主正式开始为大家分享数据库的学习&#xff…

【优选算法】——滑动窗口(下篇)!

目录 1、水果成篮 2、找到字符串中所有字母异位词 3、串联所有单词的子串 4、最小覆盖子串 1、水果成篮 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能…

【Python】heapq模块(操作最小堆,主要用途优先队列)

Python中heapq模块被称为堆队列算法,也成为优先队列算法。堆的主要用途是优先队列和堆排序。 堆(二叉树的应用):最小堆,最大堆。 最小堆:父节点小于等于所有子节点,左右子节点无大小要求&…

MFC图形函数学习06——画椭圆弧线函数

绘制椭圆弧线函数是MFC基本绘图函数,这个函数需要的参数比较多,共四对坐标点。前两对坐标点确定椭圆的位置与大小,后两对坐标确定椭圆弧线的起点与终点。 一、绘制椭圆弧线函数 原型:BOOL Arc(int x1,int y1,int x2,int y2…

Nuxt 项目安装时报错 fetch failed (详细)

报错: ERROR Error: Failed to download template from registry: Failed to download https://raw.githubusercontent.com/nuxt/starter/templates/templates/v3.json: TypeError: fetch failed. 报错原因: 对 raw.githubusercontent.com 进行了 DNS 污染,这会导致你的请…

autox.js下载并保存项目到设备使用

最近刷快手极速版薅羊毛,手动刷有点累。因此找到这个。 PS:更多内容请见官方文档:首页 (autoxjs.com) 1.下载工程化环境:https://github.com/kkevsekk1/AutoX/archive/refs/heads/dev-test.zip 手机软件下载软件:Relea…

ssm+vue680基于SSM的旅游论坛设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

盘点2024年制造业数字化转型的6大发展趋势

​目前制造业的行业数字化发展存在以下几个趋势: 1、从“增量时代”进入“存量时代”,数字化转型成为行业共识 过去几十年,我国装备制造行业从无到有,从小到大,从指数增长的增量时代,进入优化升级的存量时…

安科瑞Acrel-2000ES储能柜能量管理系统的详细介绍-安科瑞 蒋静

Acrel-2000ES储能柜能量管理系统具备全面的储能监控和管理功能。它包括了储能系统设备(如PCS、BMS、电表、消防、空调等)的详细信息,并实现了数据采集、处理、存储、数据查询与分析、可视化监控、报警管理和统计报表等功能。此外,…

ESP32的下的蓝牙应用笔记(1)——Beacon蓝牙信标

Beacon蓝牙信标简介 ‌Beacon蓝牙信标‌是一种基于蓝牙低功耗(BLE)技术的设备,主要用于提供位置信息和数据传输服务。它通过周期性地广播信号,能够在一定范围内与其他蓝牙设备进行通信,从而提供精准的位置信息和相关服…

[极客大挑战 2019]BuyFlag1

[极客大挑战 2019]BuyFlag1 审题 菜单有一个home,一个payflag 查看payflag中的要求 具体有三个要求 要有100000000块钱要是CUIT的学生回答正确的密码 知识点 http消息头的伪造 解题 抓包查看信息 看到user0,猜测这应该是CUIT的学生的判断条件…

ElementUI el-form表单多层数组的校验

问题描述 提示:这里描述项目中遇到的问题: ElementUI el-form表单多层数组的校验 页面效果: 数据结构: addform: {code: ,type: ,value: ,state: 1,remark: ,fieldList: [{fieldCode: ,resolverEntities: [{resolverType: , re…

Java基础-I/O流

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 字节流 定义 说明 InputStream与OutputStream示意图 说明 InputStream的常用方法 说明 OutputStrea…

FITS论文解析

在本文中,作者探讨了如何将复杂的频域特征提取与简单的线性模型(如DLinear)结合,以优化时间序列预测任务的效率和解释性。本文的核心思想是利用频域处理和DLinear的简化结构来达到高效的预测能力,同时保留对复杂特征的…

【go从零单排】go三种结构体:for循环、if-else、switch

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 for循环是go语言唯一的循环语句,没错,在go中再也不会看到while true package mainimport …

【数据增强】Mixup

方法来源 Mixup是2018年发表在ICLR上的一种数据增强方法,它通过将多组不同数据集的样本进行线性组合,生成新的样本,从而扩充数据集。 核心思想是从每个batch中随机选择两张图像,并以一定比例混合生成新的图像,新图像的…

基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式

时间序列数据表示了一个随时间记录的值的序列。理解这些序列内部的关系,尤其是在多元或复杂的时间序列数据中,不仅仅局限于随时间绘制数据点(这并不是说这种做法不好)。通过将时间序列数据转换为图,我们可以揭示数据片段内部隐藏的连接、模式和关系,帮助我们发现平稳性和时间连…