首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编写高效SQL的三个基础原则

第三范式 (3NF): 没有依赖于非主键或唯一键一部分的列。 虽然存在更高的范式,但这些与重叠键和多个多对多关系有关。在实践中这些很少见。确保您的表符合 3NF 将涵盖您处理的大多数情况。...一个很好的检查表是否至少规范化为 3NF 的方法是询问: “如果我更新表中的一列,是否意味着我必须同时更新其他列?” 如果答案是肯定的,那么您几乎肯定违反了某种范式。...如果您更改表的主键或其唯一约束之一中的所有列,则会出现这种情况。在这种情况下,您正在更改行的标识符,因此其他值也可能会发生更改。 与糟糕的名称一样,未规范化的表在现有应用程序中难以更改。...唯一约束: 与主键类似,唯一约束阻止您存储重复值。与主键不同,您可以在唯一列中存储空值,并且一个表可以有多个唯一约束。外键: 定义父子关系。外键指向子表中的列到父表中的主键或唯一约束。...有了这个,您就不能拥有孤立的行。非空约束: 确保您只能在列中存储非空值,即它们是强制性的。检查约束: 验证对于每一行,条件为真或未知。 定义这些约束有助于巩固规范化奠定的基础。

14300

编写高效SQL的三个基础原则

第三范式 (3NF): 没有依赖于非主键或唯一键一部分的列。 虽然存在更高的范式,但这些与重叠键和多个多对多关系有关。在实践中这些很少见。确保您的表符合 3NF 将涵盖您处理的大多数情况。...一个很好的检查表是否至少规范化为 3NF 的方法是询问: “如果我更新表中的一列,是否意味着我必须同时更新其他列?” 如果答案是肯定的,那么您几乎肯定违反了某种范式。...如果您更改表的主键或其唯一约束之一中的所有列,则会出现这种情况。在这种情况下,您正在更改行的标识符,因此其他值也可能会发生更改。 与糟糕的名称一样,未规范化的表在现有应用程序中难以更改。...唯一约束: 与主键类似,唯一约束阻止您存储重复值。与主键不同,您可以在唯一列中存储空值,并且一个表可以有多个唯一约束。外键: 定义父子关系。外键指向子表中的列到父表中的主键或唯一约束。...有了这个,您就不能拥有孤立的行。非空约束: 确保您只能在列中存储非空值,即它们是强制性的。检查约束: 验证对于每一行,条件为真或未知。 定义这些约束有助于巩固规范化奠定的基础。

14110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    模型

    当model中如果没有自增列,则自动会创建一个列名为id的列。...,表示允许为空,默认值是False null # 如果为True,则该字段允许为空白,默认值是False blank # 字段的名称,如果未指定,则使用属性的名称 db_column # 若值为True...primary_key # 如果为True, 这个字段在表中必须有唯一值,默认值是False unique # (时间字段独有)配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库...models.PROTECT # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空) models.SET_NULL # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值...) models.SET_DEFAULT # 删除关联数据,与之关联的值设为指定值 models.SET # 是否在数据库中创建外键约束,默认为True。

    25730

    MySQL数据库基础练习系列2、图书借阅管理系统

    每一列都是不可再分的最小数据单元(也称为最小的原子单元)。 解释: 在第一范式中,主要关注的是列的原子性。...也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。 例如,如果有一个“地址”列,它包含了街道、城市、省份和国家等信息,那么这就违反了第一范式。...非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。 解释: 第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。...在第二范式中,一个表只能保存一种数据,不可以把多种数据保存在同一张数据库表中。 如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。...非主键列必须直接依赖于主键,不能存在传递依赖。即非主键列必须直接依赖于整个主键,而不能依赖于主键的一部分。 解释: 第三范式是在第二范式的基础上进一步细化的。

    27410

    软件测试|MySQL唯一约束详解

    图片简介MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。MySQL中的唯一约束是一种用于确保表中某列或多列的取值唯一的数据库约束。...唯一约束是一种用于限制数据库表中某列或多列取值的约束,确保这些列中的值各不相同。在定义了唯一约束的列上,数据库系统会自动检查插入或更新操作,确保数据的唯一性。...如果有重复的值要被插入,或者违反了唯一性约束的值要被更新,数据库会拒绝这些操作并返回错误。唯一约束的定义在MySQL中,可以在创建表时或者后期通过ALTER TABLE语句来定义唯一约束。...唯一约束和主键的区别在MySQL中,唯一约束和主键是两种不同的约束类型,但它们都用于确保数据的唯一性。两者之间的区别如下:主键:主键是一种特殊的唯一约束,它要求列中的值唯一且不允许为空。...一张表只能有一个主键,它在表中起到唯一标识每一行记录的作用。唯一约束:唯一约束要求列中的值唯一,但允许为空。一张表可以有多个唯一约束,用于保证不同列或组合的值唯一。

    90820

    MySQL数据库基础练习3、订单管理系统

    订单信息表:存储订单的基本信息,如订单号、客户ID、订单总金额等。 订单明细表:存储订单中每个产品的详细信息,如产品ID、数量、单价等。...每一列都是不可再分的最小数据单元(也称为最小的原子单元)。 解释: 在第一范式中,主要关注的是列的原子性。...也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。 例如,如果有一个“地址”列,它包含了街道、城市、省份和国家等信息,那么这就违反了第一范式。...非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。 解释: 第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。...非主键列必须直接依赖于主键,不能存在传递依赖。即非主键列必须直接依赖于整个主键,而不能依赖于主键的一部分。 解释: 第三范式是在第二范式的基础上进一步细化的。

    17410

    《移动互联网技术》 第七章 数据存取: 掌握File、SharePreferences、SQLite和ContentProvider四种数据存取方式

    如果数据库中表的定义发生了改变,比如在Quiz表中增加了一列“题目所属章节”,那么就需要在数据库中重新创建Quiz表。首先删除原来的Quiz表,然后再调用onCreate() 函数重新创建它。...注意:quiz表中还有id这一列,并没有给它赋值,因为在前面创建表的时候已经将 id 列设置为自增长,它的值会随着行的插入自动生成,不需要手动赋值。...在使用GSON API之前,需要在build.gradle文件中添加对gson的依赖关系。...selection和selectionArgs 参数用于约束删除哪些行,被删除的行数将作为返回值返回。...新数据保存在 values 参数中,同样selection 和 selectionArgs 参数用于约束更新哪些行,受影响的行数将作为返回值返回。

    13310

    Spring认证中国教育管理中心-Spring Data Couchbase教程五

    它附带一组自定义集合类型,您可以将其用作查询方法返回类型,如下表所示: 您可以将第一列(或其子类型)中的类型用作查询方法返回类型,并根据实际查询结果的Java类型(第三列)获取第二列中用作实现类型的类型...然后通过返回来指示不存在查询结果null。返回集合、集合替代、包装器和流的存储库方法保证永远不会返回null,而是返回相应的空表示。有关详细信息,请参阅“存储库查询返回类型”。...@NonNull: 用于不能使用的参数或返回值null(在@NonNullApi适用的情况下不需要用于参数和返回值)。 @Nullable: 用在参数或返回值上即可null。...声明不可为空 package-info.java @org.springframework.lang.NonNullApi package com.acme; 一旦非空默认设置到位,存储库查询方法调用将在运行时验证可空性约束...如果查询结果违反了定义的约束,则会引发异常。当方法将返回null但被声明为不可为空(默认情况下,在存储库所在的包上定义注释)时,就会发生这种情况。

    1.2K10

    【云和恩墨大讲堂】谈Oracle表新增字段的影响

    出现以上问题的核心,就是为何有为空的记录存储于有NOT NULL非空约束的表中。...原因就是前面介绍过的11g新特性,新增一个有默认值的NOT NULL约束的字段,默认值不会像以前一样,插入每条记录中,而是会存储于数据字典表,Oracle允许NOT NULL列默认值为NULL,因此对于...这种新增非空约束字段在不同版本中确实有一些细节的变化,下面做一些简单测试。...根据错误提示,我们删除表中数据,再新增字段,可以增加,但不能再插入一条NULL至这个非空约束字段。...至此,12c修复了11g中这个非空约束字段允许保存空值的bug,同时又支持11g新增默认值非空字段使用数据字典存储的特性,并且做了扩展支持,满足范围更大了。可以说,小问题隐藏了大智慧。

    2.5K70

    Spring Data JPA 参考文档二

    它附带一组自定义集合类型,您可以将其用作查询方法返回类型,如下表所示: 您可以使用第一列(或其子类型)中的类型作为查询方法返回类型,并根据实际查询结果(第三列)的 Java 类型获取第二列中的类型作为实现类型...然后通过返回来指示不存在查询结果null。返回集合、集合替代、包装器和流的存储库方法保证永远不会返回null,而是返回相应的空表示。有关详细信息,请参阅“存储库查询返回类型”。...@NonNull: 用于不得为的参数或返回值null(在@NonNullApi适用的参数和返回值上不需要)。 @Nullable: 用于可以是的参数或返回值null。...如果查询结果违反了定义的约束,则抛出异常。当该方法将返回null但被声明为不可为空时(在存储库所在的包上定义的默认注释),就会发生这种情况。...} 该方法将参数和结果都定义为不可为空(Kotlin 默认值)。Kotlin 编译器拒绝传递null给方法的方法调用。

    1.2K30

    【数据库设计和SQL基础语法】--SQL语言概述--数据类型和约束

    主键是表中一列或一组列,其值用于唯一标识每个记录。主键约束的作用是确保表中的每条记录都具有唯一的主键值,同时不允许主键列包含空值(NULL)。主键约束通常在创建表时定义,可以在一个或多个列上应用。...唯一约束允许 NULL 值,即允许在该列中存在多个 NULL 值,但对于非 NULL 值,每个值都必须是唯一的。...2.6 非空约束 非空约束(NOT NULL Constraint)是一种用于确保列中的数据不为空的约束。在定义表结构时,可以通过应用非空约束来防止在插入或更新记录时将空值(NULL)插入到特定列中。...这意味着在插入或更新记录时,必须为这两列提供非空的值。 如果需要在已存在的表上添加非空约束,可以使用 ALTER TABLE 语句。...非空约束对于确保关键字段不缺失是非常有用的,同时也能够简化对数据库中的数据的处理,因为可以信任特定列中的数据不会是空的。

    47210

    使用 Spring Data Repositories(中)

    它附带一组自定义集合类型,您可以将其用作查询方法返回类型,如下表所示: 您可以使用第一列(或其子类型)中的类型作为查询方法返回类型,并根据实际查询结果(第三列)的 Java 类型获取第二列中的类型作为实现类型...然后通过返回来指示不存在查询结果null。返回集合、集合替代、包装器和流的存储库方法保证永远不会返回null,而是返回相应的空表示。有关详细信息,请参阅“存储库查询返回类型”。...@NonNull: 用于不得为的参数或返回值null(在@NonNullApi适用的参数和返回值上不需要)。 @Nullable: 用于可以是的参数或返回值null。...如果查询结果违反了定义的约束,则抛出异常。当该方法将返回null但被声明为不可为空时(在存储库所在的包上定义的默认注释),就会发生这种情况。...} 该方法将参数和结果都定义为不可为空(Kotlin 默认值)。Kotlin 编译器拒绝传递null给方法的方法调用。

    1.2K30

    SQL基础--> 约束(CONSTRAINT)

    实体完整性:表中记录不重复(任何两条记录不全等)并且每条记录都有一个非空主键 域完整性:表中字段值必须与字段数据类型、格式、有效范围相吻合 参照完整性:不能引用不存在的值 自定义完整性:根据特定业务领域定义的需求完整性...约束放置在表中,以下五种约束: NOT NULL 非空约束C 指定的列不允许为空值 UNIQUE 唯一约束U 指定的列中没有重复值,或该表中每一个值或者每一组值都将是唯一的 PRIMARY...KEY 主键约束P 唯一的标识出表的每一行,且不允许空值值,一个表只能有一个主键约束 FOREIGN KEY 外键约束R 一个表中的列引用了其它表中的列,使得存在依赖关系,可以指向引用自身的列...函数 –在查询中涉及到其它列的值 FOREIGN KEY 约束 外键约束是用来维护从表和主表的引用完整性的,所以外键约束要涉及两个表。...SET NULL: 子表中相应的列置空 如果子表在建外键时,该列的数据并不在父表,则无法创建该约束。

    1.8K20

    约束条件(constraint)「建议收藏」

    1.为啥使用约束条件: 约束条件也叫完整性约束条件,当对表中的数据做DML操作时会验证数据是否违反约束条件.如果违反了DML操作会失败.约束条件可以应用于表中的一列或几列,应用于整个表或几个表之间....约束条件分类:非空(NOT NULL),唯一(UNIQUE),主键(PRIMARY KEY),外键(FOREIGN KEY),检查(CHECK)....: ALTER TABLE table_name ADD [CONSTRAINT constraint_name] constraint_type(column,…); 3.非空约束(NOT NULL...(eno,location).在表info中eno是主键.则在表arwen中eno为外键.当insert数据到arwen中时.eno值必须是表info中的eno值.这有点像其他编程语言中的枚举类型了.你只能用里面的某一个...,不能用别的.不过此处不同的是还可以插入NULL到arwen中的eno列 注意:arwen中的eno同时也能为主键.即某一列可同时为主键和外键.

    1.7K30

    MyBatis的“基于嵌套select”映射的剖析

    jdbcType:指定该属性对应的JDBC类型,通常来说,只需在可能执行插入、更新和删除操作、且允许空值的列上指定 JDBC 类型,这完全是JDBC编程的要求。...假设有如图1所示的主从表设计: 图1 主从表设计 提示 在数据表设计中,主从表是最常见的关联设计,从表增加外键列(如图3.1中的refid列),外键列的值引用(references)主表记录,比如图3.1...中从表id为101的记录,起外键列的值为4,表明引用了主表中id为4的记录。...-- 使用select指定的select语句去抓取关联实体, 当前实体的owner_id列的值作为参数传给select语句 --> owner_id,这意味着Address实体对应的数据表记录的owner_id列的值将作为参数传给select语句。 此外,<association ...

    2.2K40

    YashanDB数据完整性

    完整性约束可以分为如下类型:约束类型描述非空约束(NOT NULL)指定列是否可以为NULL,只能在建表语句中关于列的描述后指定非空约束。...唯一约束(Unique key)在相同的列、或多个列的组合中,是否允许不同的行拥有重复的值(允许值为NULL)。主键约束(Primary key)同时满足非空约束和唯一约束。...# 非空约束默认情况下,一个表中的所有列都允许空值,使用NOT NULL约束可以指定列不允许为空值。NOT NULL约束主要用于不能缺少值的列,例如员工信息表中的姓名列。...外键的值,要么匹配被引用主键或唯一键的值,要么为空。如果复合外键中存在空值列,该键的非空列不再强制要求匹配父项中的对应列。被引用键被外键所引用的表中的唯一键或主键。...# 检查性约束检查约束具备强制执行具体的完整性规则的能力,对指定列或列集创建检查性约束,可以保证表中的数据一定满足指定的条件。如果DML语句违反了检查性约束的条件,执行会报错。

    19700

    新增非空约束字段在不同版本中的演进

    开发提了一个数据库变更需求,新增一字段,没有NOT NULL非空约束,但有默认值为NULL。...对于IS NOT NULL,type字段定义为NOT NULL,此SQL明显违反了表中的约束条件,则会在执行计划最上层增加一个NULL IS NOT NULL恒为假的条件,根本不需要真正执行这个SQL,...出现以上问题的核心,还是为何有为空的记录存储于有NOT NULL非空约束的表中。...原因就是11g新特性,新增一个有默认值的NOT NULL约束的字段,默认值不会像以前一样,插入每条记录中,而是会存储于一张数据字典表sys.ecol$,Oracle允许NOT NULL列默认值为NULL...至此,12c修复了11g中这个非空约束字段允许保存空值的bug,同时又支持11g新增默认值非空字段使用数据字典存储的特性,并且做了扩展支持,满足范围更大了。 小问题隐藏了大智慧。

    3.4K10

    【数据库设计和SQL基础语法】--表的创建与操作--表的修改和删除操作

    [DEFAULT default_value]: 可选项,指定新列的默认值。 [constraint]: 可选项,可以在此处定义列级别的约束。...COLUMN is_active BOOLEAN DEFAULT true; -- 向 'orders' 表中添加 'order_date' 列,数据类型为 DATE,同时添加非空约束 ALTER TABLE...ADD COLUMN is_active BOOLEAN DEFAULT true; -- 向 'orders' 表中添加 'order_date' 列,数据类型为 DATE,同时添加非空约束 ALTER...第三个示例中,向 ‘orders’ 表中添加 ‘order_date’ 列,数据类型为 DATE,并设置非空约束,确保每个订单都有订单日期。...一些数据库管理系统可能对修改数据类型有一些限制,例如,不能将包含数据的列修改为不允许 NULL 的列。在执行修改之前,请查阅数据库管理系统的文档以获取详细信息。

    43810
    领券