`
cppmule
  • 浏览: 447379 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

MySQL无效数据的约束

 
阅读更多

在MySQL 5.0.2之前,MySQL对非法或不当值并不严厉,而且为了数据输入还会强制将它们变为合法值。在MySQL 5.0.2和更高版本中,保留了以前的默认行为,但你可以为不良值选择更传统的处理方法,从而使得服务器能够拒绝并放弃出现不良值的语句。本节介绍了MySQL的默认行为(宽大行为),新的严格的SQL模式,以及它们的区别。

  如果你未使用严格模式,下述情况是真实的。如果将“不正确”的值插入到列,如将NULL值插入非NULL列,或将过大的数值插入数值列,MySQL会将这些列设置为“最可能的值”,而不是生成错误信息。

  · 如果试图将超范围的值保存到数值列,MySQL服务器将保存0(最小的可能值)取而代之,或最大的可能值。

  · 对于字符串,MySQL或保存空字符串,或将字符串尽可能多的部分保存到列中。

  · 如果打算将不是以数值开头的字符串保存到数值列,MySQL将保存0。

  · MySQL允许将特定的不正确日期值保存到DATE和DATETIME列(如“2000-02-31”或“2000-02-00”)。其观点在于,验证日期不是SQL服务器的任务。如果MySQL能保存日期值并准确检索相同的值,MySQL就能按给定的值保存它。如果日期完全不正确(超出服务器能保存的范围)将在列中保存特殊的日期值“0000-00-00”取而代之。

  · 如果试图将NULL值保存到不接受NULL值的列,对于单行INSERT语句,将出现错误。对于多行INSERT语句或INSERT INTO ... SELECT语句,MySQL服务器会保存针对列数据类型的隐含默认值。一般情况下,对于数值类型,它是0,对于字符串类型,它是空字符串(''),对于日期和时间类型是“zero”。

  · 如果INSERT语句未为列指定值,如果列定义包含明确的DEFAULT子句,MySQL将插入默认值。如果在定义中没有这类DEFAULT子句,MySQL会插入列数据类型的隐含默认值。

  采用前述规则的原因在于,在语句开始执行前,无法检查这些状况。如果在更新了数行后遇到这类问题,我们不能仅靠回滚解决,这是因为存储引擎可能不支持回滚。中止语句并不是良好的选择,在该情况下,更新完成了“一半”,这或许是最差的情况。对于本例,较好的方法是“仅可能做到最好”,然后就像什么都未发生那样继续。

  在MySQL 5.0.2和更高版本中,可以使用STRICT_TRANS_TABLES或STRICT_ALL_TABLES SQL模式,选择更严格的处理方式。

  STRICT_TRANS_TABLES的工作方式:

  · 对于事务性存储引擎,在语句中任何地方出现的不良数据值均会导致放弃语句并执行回滚。

  · 对于非事务性存储引擎,如果错误出现在要插入或更新的第1行,将放弃语句。(在这种情况下,可以认为语句未改变表,就像事务表一样)。首行后出现的错误不会导致放弃语句。取而代之的是,将调整不良数据值,并给出告警,而不是错误。换句话讲,使用STRICT_TRANS_TABLES后,错误值会导致MySQL执行回滚操作,如果可以,所有更新到此为止。

  要想执行更严格的检查,请启用STRICT_ALL_TABLES。除了非事务性存储引擎,它与STRICT_TRANS_TABLES等同,即使当不良数据出现在首行后的其他行,所产生的错误也会导致放弃语句。这意味着,如果错误出现在非事务性表多行插入或更新过程的中途,仅更新部分结果。前面的行将完成插入或更新,但错误出现点后面的行则不然。对于非事务性表,为了避免这种情况的发生,可使用单行语句,或者在能接受转换警告而不是错误的情况下使用STRICT_TRANS_TABLES。要想在第1场合防止问题的出现,不要使用MySQL来检查列的内容。最安全的方式(通常也较快)是,让应用程序负责,仅将有效值传递给数据库。

  有了严格的模式选项后,可使用INSERT IGNORE或UPDATE IGNORE而不是不带IGNORE的INSERT或UPDATE,将错误当作告警对待。

分享到:
评论

相关推荐

    mysql的数据约束一些基本规范

    ### MySQL 数据约束的基本规范 #### 一、MySQL 数据约束概述 数据约束是在数据库设计中非常重要的概念之一,它主要用于确保数据库中的数据完整性。通过设定不同的约束条件,可以在很大程度上避免无效数据的插入,...

    Mysql数据字典导出工具

    2. **元数据信息**:导出的元数据应包含表结构(列名、数据类型、约束等)、索引信息、存储引擎、字符集、用户权限等。 3. **使用脚本**:通常,导出会使用SQL脚本来自动化,这样可以确保一致性并减少手动操作。...

    数据一致性守护者:MySQL外键约束深度解析

    1. **防止无效数据**:假设尝试向`Departments`表中插入一条新记录,但其`EmployeeID`值不在`Employees`表中,则插入操作会被阻止。 ```sql INSERT INTO Departments (DepartmentID, DepartmentName, EmployeeID) ...

    MySQL约束_java_

    这在数据验证中非常有用,可以防止无效数据的插入。在Java的JDBC操作中,我们可以在SQL的`INSERT`语句中避免传入NULL值,或者在创建表时声明`NOT NULL`。 **检查约束**(Check Constraint)允许我们对字段的值施加...

    MySQL约束条件.doc

    MySQL 约束条件 MySQL 约束条件是指在创建表格时对字段的限制条件,以控制用户在插入数据时的行为。...MySQL 约束条件可以帮助我们创建更加健壮、安全和可靠的数据库,防止无效数据的输入和提高查询速度。

    MySQL约束_java_资料.zip

    本资料重点探讨了MySQL数据库中的约束,这些约束是确保数据完整性的重要工具。在Java编程中,理解如何在MySQL中使用约束对于开发高质量、可靠的应用程序至关重要。 MySQL约束是用来限制数据库表中数据的规则。它们...

    使用MySQL 5.0保证数据完整.pdf

    这体现了MySQL的SQL模式设置,其中"STRICT"模式会在遇到无效数据时抛出错误,而非默认地调整数据。 在MySQL中,可以通过修改配置文件`my.cnf`或在启动时指定`sql_mode`参数来改变数据完整性的执行策略。例如,设置`...

    MySQL约束课堂笔记.md

    - 有助于保持数据一致性,防止无效的引用。 #### 多表之间的关系 - **一对一关系**:两个表中的每一行只对应另一表中的一行。 - **一对多关系**:一个表中的一行对应另一个表中的多行。 - **多对多关系**:两个表...

    day03_MySQL约束2

    MySQL中的约束是数据库设计的重要组成部分,它们用于定义和维护数据的完整性和一致性。在"day03_MySQL约束2"的学习中,我们将探讨几种主要的约束类型,并结合DQL操作,如排序、聚合和分组查询,来深入理解如何在实际...

    Mysql练习3:为学生表、科目表、成绩表添加数据.zip

    为了确保数据的一致性,我们可以设置外键约束,使学生ID和科目ID分别引用学生表和科目表的主键。这样可以防止插入无效的关联数据。例如: ```sql ALTER TABLE 成绩表 ADD CONSTRAINT fk_student FOREIGN KEY (学生...

    MySQL数据完整性的研究与实现.pdf

    参照完整性确保表之间的关联,使得某一列只能引用另一表的关键字,避免无效数据的出现。在 MySQL 中,通过 FOREIGN KEY 约束实现参照完整性,要求关联表使用 INNODB 存储引擎。例如,课程成绩表 SC 中,`Sno` 字段...

    MySQL外键约束常见操作方法示例【查看、添加、修改、删除】

    在MySQL数据库中,外键约束是关系型数据库中用于维护数据完整性和一致性的重要工具。它确保了一张表中的数据与另一张表的数据之间的关联性,通常用于实现一对一、一对多或多对多的关系。本篇文章将详细讲解如何进行...

    Excel数据向MySQL导入技术.pdf

    在导入数据之前,通常需要对数据进行预处理,例如检查数据格式、去除无效值或重复项,以确保导入的顺利进行。 总的来说,Excel数据向MySQL导入的技术对于那些需要整合和管理大量非结构化数据的组织来说是一个实用的...

    第13章_约束.docx

    MySQL 数据库中,约束(constraint)是指对表数据进行额外的条件限制,以保证数据的完整性。数据完整性是指数据的精确性和可靠性,防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或...

    完整的上传,excel 导入mysql 数据库

    例如,如果Excel文件中存在无效数据或格式错误,应该捕获异常并提供清晰的错误消息。同时,记录详细的日志可以帮助追踪导入过程,便于排查问题。 最后,导入完成后,可能会需要对导入的数据进行验证,确保数据完整...

    MYSQL数据库操作入门教程

    数据完整性是指确保数据的准确性和一致性,防止无效数据进入数据库。规范化则是为了减少数据冗余和提高数据的一致性。 - **数据完整性分类**: - **数据实体完整性**:确保每个实体都有一个唯一的标识符。 - **...

    总结三种MySQL外键约束方式

    在数据库设计中,外键约束是确保数据完整性的重要机制,特别是在关系型数据库如MySQL中。外键用于建立两个表之间的关联,确保一个表中的数据(外键)引用另一个表(主表)中存在的数据(主键)。本文将详细介绍MySQL...

    6 数据库完整性及其控制_theory_数据开发_MYSQL_

    `6 数据库完整性及其控制.pdf` 这份文档可能详细阐述了如何在MySQL环境中实施和管理这些完整性概念,包括如何创建和修改表结构以包含各种完整性约束,以及如何在遇到违反完整性规则时处理错误。学习和理解这份资料将...

    mysql高级优化查询

    - **更新缓存**:如果数据发生变化,相关的缓存会被标记为无效或直接删除,以确保数据的一致性。 #### 1.3 查询缓存的影响因素 - **SQL 语句的结构**:SQL 语句中的任何变化都可能导致缓存失效。 - **表结构变化**...

Global site tag (gtag.js) - Google Analytics