搜索引擎优化高级编程:php版(ALTERTABLE约束和一个Unique约束的创建和查找约束列)

优采云 发布时间: 2022-04-12 18:07

  搜索引擎优化高级编程:php版(ALTERTABLE约束和一个Unique约束的创建和查找约束列)

  约束创建和查找

  约束的创建可以通过以下两种方式完成

  吃个栗子

  创建表 t1(

  标识 INT,

  名称 VARCHAR(20),

  id_card CHAR(18),

  主键(id),

  唯一键(名称)

  )引擎=创新;

  //查看表的索引

  从 information_schema.TABLE_CONSTRAINTS 中选择约束名称、约束类型

  WHERE table_schema = 'db_book' AND table_name = 't1';

  

  如您所见,其中有一个主键约束和一个唯一约束

  使用下面的 ALTER TABLE 添加约束

  //为其添加唯一约束,格式为:添加唯一键约束名(约束列)

  ALTER TABLE t1 添加唯一键 uk_id_card(id_card);

  

  接下来我们看一下使用外键的约束

  创建表 p(

  标识 INT,

  u_id INT,

  主键(id),

  外键(u_id) 参考 p(id)

  )引擎=创新;

  // 同样使用 SQL 来查看这个约束

  从 information_schema.TABLE_CONSTRAINTS 中选择约束名称、约束类型

  WHERE table_schema = 'db_book' AND table_name = 'p';

  

  约束和索引之间的区别

  约束和索引的创建方式相同。实际上,创建约束就是创建索引。

  但有必要区分约束和索引的概念。约束是用于保证数据完整性的逻辑概念,而索引是用于存储数据页或其他数据的数据结构。

  对不良数据的限制

  在某些默认设置下,MySQL 数据库会允许非法或不正确的数据插入和更新,或者会在数据库内部进行转换,将其转换为合法数据,例如在 NOT NULL 字段中插入 NULL 值,在某些情况下,MySQL数据库会将其改为0再插入,或者将2021-02-30等非法数据插入到DATE类型类中。这证明了数据库本身对数据的正确性没有任何约束。

  为了让 MySQL 限制添加数据的有效性,需要将 SQL_MODE(MySQL 系列中提到)改为严格模式(STRICT_TRANS_TABLES),这样 MySQL 会限制输入值的有效性,对于不同的 Errors 也会提示不同的内容。

  ENUM 和 SET 约束

  MySQL 数据库不支持传统的 CHECK 约束(CHECK 约束用于检查数据是否为特定值(不是 Null),例如男性或女性,0 或 1),但可以通过 ENUM 和 SET 完成类型解决。

  创建表一个(

  标识 INT,

  性别枚举('男','女')

  )引擎=创新;

  插入 SELECT 1,"malemale";

  创建表 b(

  标识 INT,

  性别 SET('男','女')

  )引擎=创新;

  INSERT INTO b SELECT 1,"malemale";

  

  

  可以看出控制台中的两条SQL报错,对非法输入值进行了约束,但只对离散值进行约束,即不能指定一系列连续值,比如0 ~10,所以说ENUM和SET还是无能为力。这时候,用户就需要使用触发器来实现对取值范围的约束。

  触发器和约束

  我们可以通过触发器来实现对取值范围的约束

  首先,让我们了解一下什么是触发器

  触发器的作用是在执行 INSERT、DELETE 和 UPDATE 命令之前或之后自动调用 SQL 命令或存储过程

  下面是创建触发器的命令

  创造

  [定义者={用户|CURRENT_USER}]

  TRIGGER trigger_name BEFORE|AFTER INSERT|UPDATE|DELETE

  ON tbl_name FOR EACH ROW trigger_stmt

  一个表最多可以有 6 个触发器,即三个 DDL 语句:INSERT、UPDATE 和 DELETE,每个 DDL 语句可以绑定到 BEFORE 或 AFTER(所以 3 * 2 = 6)

  《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

  【/doc/DSmxTbFJ1cmN1R2dB】 全文开源分享

  .

  通过触发器,可以实现一些 MySQL 数据库本身不支持的特性,比如高级复制、审计(即监控数据)等特性

  吃个栗子

  比如有一个用户消费表。每个用户购买一件物品后,金额应该减少。如果此时有人恶意攻击,则进行减法和复制操作,使用户购买物品后的钱增加。

  //创建消费表

  创建表用户*敏*感*词*(

  用户标识 INT NOT NULL,

  *敏*感*词* INT UNSIGNED NOT NULL

  )引擎=创新;

  //初始化一个用户数量

  插入用户*敏*感*词* SELECT 1,1000;

  //恶意攻击用户减去负值

  UPDATE usercash SET cash = cash-(-20) WHERE userid = 1;

  上面的SQL对数据库没有问题,可以正常运行,但是从业务逻辑的角度来看这是绝对错误的,因为消费意味着减去一个正值而不是一个负值。值,我们可以通过触发器来约束这个逻辑行为**(触发器可以通过新旧对象获取修改和修改前的数据)**

  //创建错误报告

  创建表 usercash_err_log(

  userid INT NOT NULL, //记录错误的用户

  old_cash INT UNSIGNED NOT NULL, //原创金额

  new_cash INT UNSIGNED NOT NULL, //修改金额

  user VARCHAR(30),//谁插入了这个错误数据(通常是数据库用户)

  TIME DATETIME //记录时间

  )引擎=创新;

  //创建存储过程

  分隔符 $$

  //只要执行了UPDATE操作就会触发,数据更新后触发

  在更新用户*敏*感*词*之前创建触发器 tgr_usercash_update

  //触发方式是每一行都会触发

  每一行

  // 开始触发处理的逻辑

  开始

  //判断修改金额是否大于修改金额

  IF new.cash-old.cash > 0 THEN

  //如果是,则表示发生了错误,应该在错误表中插入信息

  插入到 usercash_err_log

  SELECT old.userid,old.cash,new.cash,USER(),NOW();

  //将修改后的金额改回修改后的金额(即恢复数据,通过set关键字)

  SET new.cash = old.cash;

  万一;

  结尾;

  $$

  //下面是非法测试

  插入用户*敏*感*词*选择 2,1000;

  UPDATE usercash SET cash = cash - (-20) WHERE userid = 2;

  可以看到错误表中的信息

  

  金额表没有变化。

  

  外键约束

  外键用于确保引用完整性。MySQL的MyISAM存储引擎本身不支持外键,外键的定义仅作为注释,但InnoDB的存储引擎完全支持外键约束。

  InnoDB 可以使用以下语句来定义外键

  [约束 [符号]] 外键

  [index_name] (index_col_name,...)

  参考 tbl_name (index_col_name,...)

  [ON DELETE reference_option]

  [ON UPDATE reference_option]

  参考选项

  其实用户可以在建表的时候添加外键,或者添加后使用ALTER语句命令添加。

  创建表父(

  id INT NOT NULL,

  主键(id)

  )引擎=创新;

  创建表子(

  标识 INT,

  parent_id INT,

  FOREIGN KEY(parent_id) REFERENCES parent(id)

  )引擎=创新;

  

  新外键成功

  我们来测试一下外键的功能

  //向父节点插入一条数据

  插入父选择 1;

  //向child插入一条数据,并关联到parent的id

  插入子选择 1,1;

  //删除父数据(如果删除则子数据无关)

  从父级删除 id = 1;

  //添加子数据(在父表上添加不相关的数据)

  插入子选择 2,2;

  // 删除子表

  从孩子那里删除 id = 1;

  

  

  发现无法删除或添加。原因是这两个修改会破坏外键约束。如果删除了父表的数据,则子表中某条数据的外键无法匹配到父表。如果添加了孩子的数据。数据,新添加的数据的外键不能匹配到父级,所以不能成功。

  任意删除子表没问题

  也就是说,外键约束维护父表和子表之间必须有对应关系!!(一般来说外键引用的表称为父表,上面对应的栗子是父表,引用外键的表是子表,上面使用的栗子就是创建外键的子表关键结构)

  终于

  小编会在这里分享一些我平时的学习资料。由于篇幅所限,pdf文档的详细信息过于全面,细节太多,所以我只截取一些知识点进行粗略介绍。还有更详细的内容!

  开源分享:【一线厂商Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】

  程序员代码面试指导IT名企算法与数据结构问题最优解

  这是《程序员面试之书》!书中总结了著名IT公司的代码面试中各种话题的最优解决方案,并提供了相关的代码实现。针对目前程序员面试中缺乏权威话题——痛点,本书精选了近200道实际出现过的经典代码面试题,帮助广大程序员顺利备考,“写”完本书,你就是“题王”!

  

  “TCP-IP 协议套件(第 4 版)”

  本书是介绍 TCP/IP 协议套件的经典书籍的最新版本。这本书从第一版开始就受到读者的欢迎。

  本书最新版为《护元》,反映了计算机网络技术的最新发展。本书有七大部分,共30章和七个附录: 第一部分介绍一些基本概念和基础底层技术: 第二部分介绍网络层协议: 第三部分介绍传输层协议;第四部分介绍应用层协议: 第五部分介绍下一代协议,即IPv6协议: 第六部分介绍网络安全问题: 第七部分给出七个附录。

  

  Java开发手册(松山版)

  阿里的开发手册不用说了,每次更新我都会看的,这是8月初的最新更新(松山版)**

  

  MySQL 8 从入门到精通

  本书主要内容包括MySQL安装与配置、数据库创建、数据表创建、数据类型和运算符、MySQL函数、查询数据、数据表操作(插入、更新和删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份和恢复、MySQL日志、性能优化、MySQL Replication、MySQL Workbench、MySQL Utilities、MySQL Proxy、PHP操作MySQL数据库和PDO数据库抽象类库等。最后通过3的数据库设计综合案例,描述MySQL在实际工作中的应用取得进展。

  

  Spring5高级编程(第5版)

  如果您想充分利用这个领先的企业 Java 应用程序开发框架的强大功能,本书涵盖了 Spring 5 的所有内容,是最全面的 Spring 参考和实用指南。

  本书的第五版涵盖了核心 Spring 及其与其他领先的 Java 技术的集成,例如 Hibemate JPA 2.Tls、Thymeleaf 和 WebSocket)。本书的重点是如何使用 Java 配置类、lambda 表达式、Spring Boot 和反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层等。

  

  JAVA核心知识点+1000道互联网Java工程师面试题

  

  

  企业IT架构转型之路 阿里巴巴中台战略思想与架构实践

  本书讲述了阿里巴巴的技术发展史,也讲述了互联网技术架构的实践和发展史。

  

  本文已被CODING开源:【一线厂商Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线