引用和实体完整性

        本文将详细讲解在数据库服务器级具有引用和实体完整性的好处,包括如何在字段中设置默认值、检查约束和引用约束,以及在何时发生约束检查。通过遵循这些指导原则,可以确保数据的一致性和准确性。

1.完整性

  完整性指数据库中数据的准确性或正确性。

  • 引用完整性
    引用完整性强制执行表之间的主键和外键关系。例如,客户记录必须存在,才能为该客户下订单。

  • 实体完整性
    实体完整性通过创建主键来唯一标识表中的每一行数据。

  • 语义完整性
    语义完整性通过使用以下内容来实现:

  — 数据类型:数据类型定义您可以存储在列中的值的类型。例如,数据类型smallint允许您输入从 -32767 到 32767 的值。

  — 默认值:默认值是在未指定显示值时插入列中的值。例如,操作时间字段,可能默认为当前时间。

  — 检查约束:检查约束指定在列中插入或更新的数据的条件。插入表中的每一行都必须符合这些条件。例如,表的 quantity 列可能会检查大于或等于1的数量。检查约束也可用于表中的强制关系。例如,在 order 表中,ship_date必须大于order_date。

  — NOT NULL 约束:NOT NULL 约束确保在插入和更新操作过程中列包含一个值。

1.1 应用级的完整性

1693191456720

1693191456720890×467 12.8 KB

  可以在应用程序中执行完整性检查。例如,要验证状态值,您可以使用表中的state 属性指定有效状态,或者您可以使用SinoDB 4GL 的SELECT 语句来检查表中的值。虽然第二种方法比较灵活,但是可能导致检查不一致。此外,如果约束值发生变化,则可能需要修改所有受影响的应用程序代码。上图的示例中,form1与form2与SinoDB 4GL程序不一致。

1.2 数据库服务级的完整性

1693191786449

1693191786449888×467 12.1 KB

  通过在数据库服务器级别进行完整性约束检查,可以确保所有应用程序的一致性。

2. 完整性约束的类型

  以下列出了在 SinoDB 中实现的引用、实体和语义完整性(数据类型除外)的类型。CHECK、UNIQUE 和 NOT NULL 约束在单个行内应用完整性检查,而引用约束则在行之间应用完整性检查。

  • 默认值:自动为 INSERT 语句中忽略的列提供值。
  • NOT NULL 约束:在插入(如果没有默认值)或更新期间需要为列提供值。
  • 检查约束:所有插入和更新的行都必须满足此约束定义的条件。
  • 引用约束:执行主键和外键关系。
  • 唯一约束:插入或更新的每一行都必须具有键指定的唯一值。

unique、not null 和 default 约束示例

CREATE TABLE orders(
 order_num INTEGER UNIQUE ,
 order_date DATE NOT NULL DEFAULT TODAY );

ALTER TABLE orders
MODIFY order_num INTEGER NOT NULL ;

2.1 约束名称

CREATE TABLE orders(
 order_num INTEGER UNIQUE
  CONSTRAINT order_num_uq,
 order_date DATE NOT NULL
  CONSTRAINT order_date_nn
 DEFAULT TODAY);

ALTER TABLE orders
 MODIFY order_num INTEGER NOT NULL
  CONSTRAINT order_num_nn;

  约束由其名称标识。您可以为其命名或者使用数据库服务器分配的默认名称。但是这些名称在数据库中必须是唯一的。

  系统默认名称是约束 ID 代码,表 ID 和唯一约束 ID的组合。使用命名约定命名约束,而不是使用系统默认值。这样更容易识别约束。

  需要为所有的约束分配名称:primary-key、foreign-key、unique、check和NOT NULL。

  约束名称存储在sysconstraints系统目录表中。 如果要更改特定约束的模式(例如,启用,禁用或过滤),就需要知道名称:

----禁用约束pk_items, fk1_items
SET CONSTRAINTS pk_items, fk1_items TO DISABLED

  也可以为整个表设置约束,而不用知道该约束名称。例如:

SET CONSTRAINTS FOR TABLE orders TO DISABLED;

  要删除约束而不以任何其他方式更改表,请使用 ALTER TABLE 命令的 DROP 子句:

ALTER TABLE items DROP CONSTRAINT pk_items;

2.2 CHECK约束

  • 添加表级约束

ALTER TABLE items ADD CONSTRAINT
CHECK (quantity >= 1 AND quantity <= 10)
CONSTRAINT ck_items_qty;

  • 在列级别添加等效约束

ALTER TABLE items MODIFY quantity SMALLINT
CHECK (quantity >= 1 AND quantity <= 10)
CONSTRAINT ck_items_qty;

  • 如果对列添加约束,那么不能引用其他列。

ALTER TABLE orders MODIFY paid_date DATE
CHECK (paid_date > ship_date) CONSTRAINT ck_paid_date;

#676: Invalid check constraint column.

  • 在表级别添加引用多个列的约束,这些列必须来自同一个表

ALTER TABLE orders ADD CONSTRAINT
CHECK (paid_date > ship_date) CONSTRAINT ck_paid_date;

  注:当修改列时,请修改关于该列的所有内容,这就是 MODIFY 子句必须包含数据类型的原因。 如果不使用 MODIFY 子句列出所有约束,那么会删除未列出的任何约束。

2.3 引用约束

XIX_~NYDYXM856YF{N~W3WJ

  引用约束允许用户指定主键和外键来实现父表与子表(主表与从表)的关系。要定义引用约束,用户必须具有REFERENCES 权限或作为表所有者。

  假定在插入、更新或删除每一行时执行检查引用约束,使用引用约束有以下限制:

  • 如果用户删除 了 PRIMARY KEY ,但是存在相应的 FOREIGN KEYS,则删除失败。请使用级联删除来规避此限制。

  • 如果用户更新 了 PRIMARY KEY ,但是存在与 PRIMARY KEY 的原始值相对应的 FOREIGN KEYS,则更新失败。

  • 没有任何与删除 FOREIGN 键相关的限制。

  • 如果用户更新 了 FOREIGN KEY,并且不存在与 FOREIGN KEYS 的新的非NULL值相对应的PRIMARY KEY,则更新失败。

  • PRIMARY KEY 中的所有值都必须是唯一的。

  • 当用户将一行插入 子表中时,如果所有 FOREIGN KEYS 都为非 NULL,并且不存在相应的 PRIMARY KEY,则插入失败

要完全执行引用完整性,请勿在主键和外键列中允许NULL值。

2.4 引用约束的类型

  • 循环引用约束强制执行表之间的父与子关系。
  • 自引用约束在表内强制执行父与子关系。
  • 多路径约束是指可以有多个外键的主键

2.4.1 循环引用约束

  循环引用约束强制执行表之间 的父表与子表(主表与从表)关系。要强制执行引用约束,您必须在父表中指定主键,并在子表中指定相应的外键。每个表只能有一个主键。REFERENCES 子句指定父表。因为该表中只允许有一个主键,所以您无需在 references子句中列出列名。

循环引用约束:示例

CREATE TABLE customer(
 customer_num SERIAL,
 fname CHAR(20),
PRIMARY KEY (customer_num) CONSTRAINT pk_cnum
);

CREATE TABLE orders(
 order_num SERIAL,
 customer_num INTEGER,
FOREIGN KEY (customer_num)
REFERENCES customer CONSTRAINT fk_cnum
);

INSERT INTO customer VALUES (1, “Smith”);
INSERT INTO orders VALUES (0, 1);
INSERT INTO orders VALUES (0, 2);
#
#691: Missing key in referenced table for
#referential constraint (karen.fk_cnum).
#111:ISAM error: no record found.

DELETE FROM customer WHERE customer_num = 1;
# ^
#692:Key value for constraint (karen.pk_cnum)
#is still being referenced.

  在上述示例中,由于客户编号2不存在于 customer 表中,因此订单不能添加到客户编号2的 orders 表中。

  客户编号1无法从 customer 表中删除,因为订单位于客户编号1的 orders 表中。如果客户记录丢失,您要谁为订单付款?

级联删除

CREATE TABLE customer (customer_num INT, PRIMARY
KEY(customer_num));
CREATE TABLE orders (order_num INT, customer_num INT,
PRIMARY KEY(order_num),
FOREIGN KEY(customer_num) REFERENCES customer
ON DELETE CASCADE);

$ DELETE FROM customer WHERE customer_num = 101;
/* all rows in orders table for customer 101 are
automatically deleted */

  级联删除 可让您定义引用约束,在引用约束中当相应的父行被删除时,数据库服务器会自动删除子行。此功能在简化应用程序代码和逻辑方面非常有用。

  级联删除提供了性能增强,因为通过自动删除数据库服务器中的行而不是要求应用程序先删除子行,处理的 SQL 语句更少。数据库服务器可以更有效地处理删除,因为不会产生 SQL 语句的开销。

  如果由于任何原因,原始 DELETE 语句失败或子行上产生的 DELETE 语句失败,那么会回滚整个 DELETE 语句。

  要调用级联删除,请在子表的 CREATE TABLE 语句中的 REFERENCES 子句之后添加 ON DELETE CASCADE 子句。

  使用级联删除的限制

  • 数据库必须具有日志记录。
  • 子表不能涉及父表中涉及DELETE语句的相关子查询。

  无日志数据库可以创建级联删除,但是,级联删除未激活。如果关闭数据库日志,则级联删除将被禁用(您将收到引用完整性错误)。一旦开启数据库日志,级联删除将自动重新激活; 管理员无需采取任何行动。

  在父表的DELETE语句中使用子表的相关子查询不会使用级联删除。相反,您会收到以下错误:

735: Cannot reference table that participates in a cascaded delete.

  添加级联删除
  如果列具有外键约束,并且您要添加级联删除,那么请删除该约束并使用ON DELETE CASCADE子句重新添加:

ALTER TABLE orders DROP CONSTRAINT orders_fk1,
 ADD CONSTRAINT (FOREIGN KEY (customer_num)
  REFERENCES customer
  ON DELETE CASCADE
  CONSTRAINT orders_fk1);

  可以删除该约束并使用相同的ALTER TABLE语句重新添加。当您在同一ALTER TABLE语句中执行这两个操作时,不会删除索引,因此这样操作开销是最小的。

2.4.2 自引用约束

  自引用约束强制执行表中的父表与子表(主表与从表)关系。

CREATE TABLE emp(
 enum SERIAL,
 mnum INTEGER,
PRIMARY KEY (enum) CONSTRAINT pk_enum,
FOREIGN KEY (mnum) REFERENCES emp
CONSTRAINT fk_enum);

INSERT INTO emp VALUES (1, 1);
INSERT INTO emp VALUES (2, 1);
INSERT INTO emp VALUES (3, 10);

#691: Missing key in referenced table for
#referential constraint (karen.fk_enum).
#111: ISAM error: no record found

  此示例假定使用员工表来跟踪所有员工及其分配的管理员。使用自引用约束来确保分配给每个员工的管理员存在于员工表中。也就是说,不能有一个不是员工的管理员。eum(员工编号)是存储在mnum列(管理员编号)中的一组值必须存在的主键。在该示例中,emp表要求在eum(员工编号)列中输入的值必须存在,然后才能添加到mnum(管理员编号)列。允许管理员编号为1,但管理员编号为10会失败。

2.4.3 多路引用约束

  多路径引用约束是指可以有多个外键的主键。

CREATE TABLE stock
 (stock_num SMALLINT, manu_code CHAR(3),…,
PRIMARY KEY (stock_num, manu_code) CONSTRAINT pk_stock);

CREATE TABLE items (
 item_num SMALLINT,
 stock_num SMALLINT,
 manu_code CHAR(3),…,
FOREIGN KEY (stock_num, manu_code)
REFERENCES stock
CONSTRAINT fk1_stock);

CREATE TABLE catalog(
 catalog_num SERIAL,
 stock_num SMALLINT,
 manu_code CHAR(3),…,
FOREIGN KEY (stock_num,manu_code)
REFERENCES stock
CONSTRAINT fk2_stock);

  以上示例显示一个父表 stock 有两个子表(items 表和 catalog 表)。为了清楚起见,其他列被排除在示例之外。

2.5 创建主键约束

创建具有主键约束的表的两种方法:

  • 在列的列表末尾

CREATE TABLE customer(
  customer_num SERIAL,
  fname CHAR(20),
PRIMARY KEY(customer_num)
CONSTRAINT pk_cnum);

  • 在列定义的末尾。

CREATE TABLE customer(
  customer_num SERIAL
PRIMARY KEY CONSTRAINT pk_cnum,
 fname CHAR(20));

  可以通过两种方式在CREATE TABLE语句中添加引用约束。上述方法完成了同样的事情。但是,只能使用第一种方法来创建复合主键。

2.6 创建外键约束

创建具有外键约束的表的两种方法:

  • 在列的列表末尾

CREATE TABLE orders(
  order_num SERIAL,
  customer_num INTEGER,
FOREIGN KEY(customer_num)
REFERENCES customer CONSTRAINT fk_cnum);

  • 在列定义的末尾

CREATE TABLE orders(
  order_num SERIAL,
  customer_num INTEGER
   REFERENCES customer CONSTRAINT fk_cnum);

  可以通过两种方式在CREATE TABLE语句中添加引用约束。上述方法完成了同样的事情。但是,只能使用第一种方法来创建复合外键。

2.7 添加主键约束

将主键约束添加到现有表的两种方法:

  • 向表添加约束

ALTER TABLE customer ADD CONSTRAINT
PRIMARY KEY(customer_num)
CONSTRAINT pk_cnum;

  • 修改列定义

ALTER TABLE customer
 MODIFY customer_num SERIAL
PRIMARY KEY CONSTRAINT pk_cnum;

  可以通过两种方式在ALTER TABLE语句中添加引用约束。上述方法完成了同样的事情。但是,只有第一种方法可以创建复合主键(多个列)。此外,第二种方法修改了有关列的所有内容,所以必须小心包含所有约束,而该列所有未列出的约束都将被删除。

2.8 添加外键约束

将外键约束添加到现有表的两种方法:

  • 向表添加约束

ALTER TABLE orders
 ADD CONSTRAINT
FOREIGN KEY(customer_num)
  REFERENCES customer CONSTRAINT fk_cnum;

  • 修改列定义

ALTER TABLE orders
 MODIFY customer_num INTEGER
  REFERENCES customer CONSTRAINT fk_cnum;

  在ALTER TABLE语句中添加引用约束有两种方法。上述方法完成了同样的事情。但是,只能使用第一种方法来创建复合外键(多个列)。此外,第二种方法修改了列的所有内容,所以您必须小心包含所有约束,而该列所有未列出的约束都将被删除。

3. 系统目录表

Q_O(8CRXD52LNG383UYTYH

Q_O(8CRXD52LNG383UYTYH886×210 27.6 KB

以下系统目录表可用于强制执行引用和实体完整性:

syschecks包含check约束的文本。
sysdefaults跟踪每个具有用户指定的默认值的列。
sysreferences列出对数据库中的列设置的referential约束。
sysconstraints存储primary、check和referential 约束以及unique约束
syscoldepend跟踪每个check约束中指定的表列。

更多信息内容请移步星瑞格官方社区,期待大家加入
Sinoregal Tech Forum

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux线程(二)】线程互斥和同步

前言&#xff1a; 在上一篇博客中&#xff0c;我们讲解了什么是线程以及如何对线程进行控制&#xff0c;那么了解了这些&#xff0c;我们就可以在程序中创建多线程了&#xff0c;可是多线程往往会带有许多问题&#xff0c;比如竞态条件、死锁、数据竞争、内存泄漏等问题&#…

福建聚鼎:做装饰画到底能不能赚钱

在探讨做装饰画能否成为盈利的行当之前&#xff0c;我们必须认识到任何一门艺术或手工的价值并非仅仅取决于其直接的经济收益。艺术创作本身就是一种文化传承和个人情感表达的方式&#xff0c;它对创作者和社会都有着不可估量的精神价值。然而&#xff0c;将话题限定在经济回报…

【机器学习300问】81、什么是动量梯度下降算法?

动量梯度下降算法&#xff08;Momentum&#xff09;是利用指数加权移动平均的思想来实现梯度下降的算法。让我们先来回顾一下基础的梯度下降方法以及看看它有哪些不足之处。接着引出动量梯度下降算法&#xff0c;在理解了它的原理后看看它是如何规避之前方法的不足的。 如果不知…

Java开发大厂面试第01讲:String 的特点及其重要的方法都有哪些?

几乎所有的 Java 面试都是以 String 开始的&#xff0c;如果第一个问题没有回答好&#xff0c;则会给面试官留下非常不好的第一印象&#xff0c;而糟糕的第一印象则会直接影响到自己的面试结果&#xff0c;就好像刚破壳的小鹅一样&#xff0c;会把第一眼看到的动物当成自己的母…

制药行业新突破:CANOpen转PROFINET网关配置案例解析

在药品制造工业环境中&#xff0c;实现CanOpen转Profinet协议之间转换的网关配置是一个关键过程&#xff0c;确保了不同通信协议的设备能够互相协作。以开疆智能CanOpen转Profinet网关为例&#xff0c;以下是其配置流程&#xff1a;首先安装CanOpen转Profinet网关的配置软件&am…

Linux禁用危险命令和防止误操作

禁用rm命令 编辑/etc/profile文件&#xff0c;结尾添加 ###### rm prevent ###### alias rmecho can not use rm command使用source命令生效 source /etc/profile效果 使用mv命令代替rm命令 将需要删除的文件移动到特定的目录&#xff0c;比如/home/sharedir/ 在.bashrc目…

波卡 2024 一季度报告:XCM 创下历史新高,JAM 链将引领 Polkadot 2.0 新风向

作者&#xff1a;Nicholas Garcia&#xff5c;Messari 研究分析师 编译&#xff1a;OneBlock 原文&#xff1a;https://messari.io/report/state-of-polkadot-q1-2024 近期&#xff0c;Messari Crypto 发布了 Polkadot 2024 年 Q1 状况的数据报告。OneBlock 为你梳理了本篇报…

python批量为图片做灰度处理

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结

MES管理系统在柔性制造中有何重要作用

在当今这个瞬息万变的商业环境中&#xff0c;制造业正经历着一场前所未有的转型。消费者需求的多样化和市场动态的快速变化要求企业必须具备高度的灵活性和适应性。为了应对这些挑战&#xff0c;柔性制造策略应运而生&#xff0c;它以其快速响应和灵活调整的能力&#xff0c;成…

vue3中的watch侦听器

在有些情况下&#xff0c;我们需要在状态变化时执行一些“副作用”&#xff1a;例如更改 DOM &#xff0c;或是根据异步操作的结果去修改另一处的状态。在组合式 API 中&#xff0c;我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数。 watch 函数可以侦听被 ref…

计算机的一些基础知识分享

windows操作系统中&#xff0c;用于查看当前文件下的目录是&#xff1f; 在Windows操作系统中&#xff0c;如果您想要查看当前文件夹下的目录&#xff0c;您可以使用命令提示符&#xff08;CMD&#xff09;或PowerShell。在这些环境中&#xff0c;可以使用以下命令&#xff1a;…

bmi088-linux驱动(I2C)

电气特性&#xff1a; 在正常工作时&#xff0c;gyro 工作电流为5mA&#xff0c;acc 工作电流为150uA。 SPI 时钟和数据电平范围 0 -3.6 结构框图如下&#xff1a; 硬件连接图如下&#xff1a; note&#xff1a; 1. 通过PS引脚选择通讯协议&#xff0c;上拉引脚则选择的是I2C…

HCIP的学习(16)

BGP的状态机 ​ OSPF的状态机是在描述整个协议的完整工作过程&#xff0c;而BGP的状态机仅描述的是对等体关系建立过程中的状态变化。-----因为BGP将邻居建立过程以及BGP路由收发过程完全隔离。 ​ IGP协议在启动后&#xff0c;需要通过network命令激活接口&#xff0c;从而使…

企业运维背后的故事:TASKCTL带你了解日常工作与技术演进

今天&#xff0c;作为一名经验丰富、从业多年经常与运维人员打交道的人&#xff0c;我想与大家聊聊运维的日常工作、部门协调以及未来发展&#xff0c;希望能为即将转行或正在从事运维工作的你&#xff0c;提供一些新的视角和启发。 运维的日常工作&#xff1a;挑战与乐趣并存 …

朱啸虎:AI应用明年肯定大爆发;第3款爆火AI游戏出现了;AI应用定价策略「不能说的秘密」;人类数据不够用了怎么办 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 1. 换你来当爹&#xff1a;国内第3款爆火出圈的AI游戏应用&#xff0c;hhh 太搞笑了 周末的时候&#xff0c;社群里伙伴们开始玩一款「换你来当爹」的…

[Java EE] 多线程(九):JUC剩余部分与线程安全的集合类(多线程完结)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

群晖 Synology DSM7 过热关机解决方法

最近已经提示我过热关机过两次了&#xff0c;这两次一次是用虚拟机&#xff0c;一次是批量使用Synology Photos批量上传照片&#xff1a; 但是我没有对主机进行任何的位置移动以及硬件修改操作&#xff0c;散热环境没有发生变化。以前使用从来没有出现过这个问题&#xff0c;同…

MySQL Workbench创建数据库和景点评价表

创建一个数据库和一张用于存储景点评价的表。 一 创建数据库 1.双击选择 local instance MySQL80 2. 输入密码 连接成功 3. 创建 mydatabase数据库 4.确认创建 mydatabase数据库 5.选择finish 6.选择 Schemas查看刚才创建的mydatabast数据库 二、创建表 1.创建表 2.设置表信…

视觉SLAM十四讲:从理论到实践(Chapter3:三维空间刚体运动)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 目标 理解三维空间的刚体运动描述方式&#xff1a;旋转矩阵、变换矩阵、四元数和欧拉角。掌握Eigen库的矩阵、几何模块的使用方法。 3.1 旋转矩阵 3.1.1 点、向量和…

建立一物一码数字化营销体系,纳宝科技助力五丰黎红在调味品行业再创佳绩!

五丰黎红隶属于华润五丰集团&#xff0c;公司历史可溯源至1979年&#xff0c;前身是汉源花椒油厂&#xff0c;是一家拥有悠久历史的调味品品牌。一直以来&#xff0c;五丰黎红坚持调味品原料、研发、生产、加工一体化的全产业链经营模式&#xff0c;以“质量”为核心&#xff0…