精华内容
下载资源
问答
  • 关于数据库数据唯一保证

    千次阅读 2017-10-11 09:03:09
    数据库数据唯一性 在项目问题不断出现情况下,几经经验,得出一个结论:数据库数据的唯一性无法通过软件里的代码保证,只有数据库自身的唯一索引才可能保证插入的数据是始终唯一的。 例如,之前试图通过插入...

    数据库数据唯一性
    在项目问题不断出现情况下,几经经验,得出一个结论:数据库数据的唯一性无法通过软件里的代码保证,只有数据库自身的唯一索引才可能保证插入的数据是始终唯一的。

    例如,之前试图通过插入数据库的语句来实现不插入相同值“INSERT IGNORE INTO  ...”,在单独实验一两条数据中,的确相同的数据并不能重复插入,但是在之后的应用中,数据库里偶尔确实会出现相同的值,也就是这一方式无法保证数据唯一性。

    在出现这一问题之后,本以为只是此种方式会有时失效而已,所以在此种方式插入之前,通过代码“SELECT COUNT(*) FROM ...”来进行一次查询,如果查询到的结果为零则开始之前的插入语句,本以为经过两重限定,可以完全避免数据重复。最终结果还是一样,重复数据仍然存在。

    苦恼之余,查询多方答案,最终:对于软件来说,数据库在繁忙的时候,不知道会返回些什么鬼东西过来,唯一能保证数据唯一性的就是在数据库里面创建数据唯一索引。


    创建数据库唯一索引

    建立一个简单索引

    CREATE INDEX mytable_categoryid ON mytable (category_id);

    建立一个多重索引

    CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id);

    建立一个唯一性索引

    CREATE UNIQUE COUSTERED INDEX mytable_categoryid_userid ON mytable(category_id,user_id);

    建立一个聚簇索引:物理索引,表顺序与基表相同

    CREATE CLUSTERED INDEX mytable_categoryid ON mytable (category_id) WITH ALLOW_DUP_ROW;(允许重复值)

    建立一个非聚簇索引

    CREATE UNCLUSTERED INDEX mytable_categoryid ON mytable (category_id);



    展开全文
  • 1为什么要保证数据的完整性:防止存储垃圾数据,从而影响数据库的执行效率。 2 完整性的分类:实体、域、引用、用户自定义。 3实现实体完整性的方法:唯一(unique)、主键( Primary key) 概括:保证一行数据的...

      保证数据的完整性                    

    要点:

    1为什么要保证数据的完整性:防止存储垃圾数据,从而影响数据库的执行效率。

    2 完整性的分类:实体、域、引用、用户自定义。

    3实现实体完整性的方法:唯一(unique)、主键(

    Primary key)

    概括:保证一行数据的有效。

    4实现域完整性的方法:非空、检查、默认

    概括:保证一列数据的有效。

     

    5实现引用完整性的方法:外键约束

    概括:保证引用的编号是完整的

     

    6实现自定义完整性的方法:触发器、储存过程

    概括:保证自定义规则

    7解析唯一约束:unique

    8解析主键约束:primary key

    9解析非空约束:not null

    10 解析默认值约束:default

    11解析检查约束:check(mysql不支持)

    12 使用自动编号列:auto_increment

    13 外键约束:

    1. SQL server:constraint    新的名称 foreign key

    (当前表的某列) reference 其他表(某列)

    1. Mysql:

    14 查询的方法:Select  * from 表1 别名,表2 别名    where a 主键=b外键约束的列

    注意:主键不能为空,不能重复。

             唯一可以是空,不能重复。

             自动编号通常与主键约束一起使用。

            在mysql里面唯一约束会被默认为索引(若要删除唯一约束,则代码与删除索引的方法想通过:

    例如:删除唯一约束是id的列在表friend中。

    :alter table friend drop index id)。

    转载于:https://www.cnblogs.com/yufei121/p/5113527.html

    展开全文
  • 如何保证数据库表中数据唯一

    千次阅读 2019-09-11 10:42:55
    在很多时候,我们需要保证数据库表中某条数据唯一的,那如何保证数据库表中数据唯一性呢?这个值得探讨一下

    问题描述:在之前的应用开发中,有这么一个需求,多个用户会对阅读内容提出自己的意见,后端采用不记名方式,前者提的意见会覆盖后者的意见。 系统在运行过程中出现过一个问题,二个用户都对同一篇文章提意见,时间相同,前端在用户的二个客户端浏览器下分别获取到数据库中都不存在这条记录,所以当用户同时点击保存的时候数据库中会有针对这篇文章的两条数据,这与实际业务规定的不符合。

    针对这个问题可能出现的原因咱们来分析一下原因:
    (1)最不靠谱的情况是,A用户发现数据库没有数据,编辑完后产生一条,同时B用户也发现从来没有用户编辑过这条数据,从而也产生一条数据,此时前端已经存在二条相关数据了,后端没有任何判断和校验,直溜溜的插入库里,这种一般程序员应该不会犯;
    (2)在(1)一样的前提下,产生二条相关数据,程序员在service中先查一个数据是否存在,如果不存在相关数据就插入,存在则更新原有记录,这种会很大程度的解决重复数据的问题。但是应付不了多并发的情况,大家都知道Mysql支持可重复读模式,当第一个线程已经插入但是还没有提交的时候,另一个事务在执行期间是读不到这个数据的,还是会执行插入,谁也不能保证他们不是同时commit的,这样数据库中又出现了两条数据,此时问题无法解决;
    (3)有的程序员暴脾气,没招就只能把这个任务交给数据库拜,给数据库表加唯一索引,看它还插入,当然,这种不管不顾的做法确实保证了最终的数据没问题,但是这是以牺牲程序的可用性为前提的,没有经验的程序员还有可能把这个错误留给前端,客户都能看到异常,更有可能导致参与的事务不回滚,造成其他数据问题。无论怎么样一句话就是本次用户白干了拜而且还发现系统出问题了,暴脾气的用户一个电话就找过来了,这样很不好啊!

    最终解决方案
    synchronized 参数从来都是为控制并发设计的,当然这个是以牺牲性能为前提的,一个系统你得先保证数据对的前提下,你才能去保证性能吧。有的同学直接随意的在service的方法上加入这个synchronized 参数,这太随意了,其实他没注意到自己的方法上加了@Transactional参数开启了事务,大家都知道事务是通过AOP动态代理实现的,执行这个方法之前,先打开数据库连接,开启事务,当进入这个方法的时候,锁才开始起作用,当这个方法退出,事务还是没有结束,还没有commit提交的情况下,另一个事务执行的进度就赶上了了,又可以同时提交,最终出现2条数据,那问题出现在哪呢?
    问题是你这个synchronized 应该加到调用这个service的地方,让锁能够控制整个事务提交过程,这样就能保证数据的唯一性了,所以有些事情如果程序能够解决的不要交给数据库处理,如果哪天来个新手整错脚本,漏掉了这个校验,还是会有脏数据入库,你只能苦哈哈的在一片声讨声中处理历史数据,怎一个惨字了得!!!
    如果大家有别的更好更优雅的办法也请不吝赐教。

    展开全文
  • 对于数据库来说,关系型数据库对于保证数据完整性和一致性方面表现是最好的! 数据的完整性 完整性分类 具体描述 如何保证 实体完整性 每个实体都是独一无二的 主键 / 唯一索引(唯一约束) 参照完整性...

    对于数据库来说,关系型数据库对于保证数据完整性和一致性方面表现是最好的!

    数据的完整性

    完整性分类 具体描述 如何保证
    实体完整性 每个实体都是独一无二的 主键 / 唯一索引(唯一约束)
    参照完整性(引用完整性) 子表中不能有父表中没有的数据 外键
    域完整性 数据都是有效的 数据类型和长度、非空约束、默认值约束、检查约束

    数据的一致性:

    数据的一致性通过事务实现 —> 一系列的对数据进行的不可分割的操作,要么全做,要么全部做

    事务的ACID特性:

    事物的特性 描述
    Atomicity(原子性) 不可分割
    Consistency(一致性) 事务前后数据状态保持一致
    Isolation(隔离性) 多个并发的事务不知道彼此的中间状态
    Duration(持久性) 事务完成后,对数据的修改要持久化

    并发事务访问数据可能产生五大类的问题:

    • 第一类丢失更新
    • 第二类丢失更新
    • 脏读(读脏数据)
    • 不可重复读
    • 幻读

    如何解决这五类问题

    • 单版本并发控制 - 锁 - 悲观锁 - 性能太差
    • 多版本并发控制(MVCC)- 乐观锁 - 性能更好 - 需要冗余字段来支持

    直接操作锁非常的麻烦,我们可以通过设置事务隔离级别的方式,让数据库自动选择合适的锁机制来保护数据。

    事物的隔离级别 特点
    read uncommitted 可以读到脏数据
    read committed Oracle默认的隔离级别 -不能避免不可重复读现象,但不会读到脏数据
    repeatable read 避免不可重复读现象( MySQL默认的事物隔离级别) 另一个事物更新数据,刚才查到的是什么,现在还是什么(查询事物没有提交和回滚之前都可以重复读)
    serializable 此种方法不会出现并发数据的问题,但是效率地下,不建议使用

    MySQL如何查看和修改事务隔离级别(transaction —> tx)

    功能 方法
    查看事物隔离级别 select @@tx_isolation
    修改事物隔离级别 set session transaction isolation level read committed

    在Linux环境下验证不同事物隔离级别的特性所需要使用到的命令

    事物过程 相关命令
    开事物 begin; / start transaction;
    提交事物 commit;
    回滚事物 rollback;(未提交之前,取消前面的操作,如更新或删除操作)

    linux下面验证的场景举例:
    数据库连接:mysql -u root -p

    第一个实验场景:读脏数据

    事物A:
    beginupdate tb_emp set sal=2800 where eno = 1359;
    事物B:
    set session transaction isolation level read committed;
    begin;
    select * from tb_emp;       --->读脏数据
    commit;
    事物A:
    rollback;
    

    第二个实验场景:不可重复读

    事物B:
    set session transaction isolation level read committed;
    begin;
    select * from tb_emp where sal<3000;
    事物A:
    beginupdate tb_emp set sal=3800 where eno=1359;
    commit;
    事物B:
    select * from tb_emp where sal<3000; --->没有1359对应的记录了,不可重复读
    commit

    第三个实验场景:可以重复读

    事物B:
    set session transaction isolation level repeatable read;
    begin;
    select * from tb_emp where sal<3000;
    事物A:
    beginupdate tb_emp set sal=3800 where eno=1359;
    commit;
    事物B:
    select * from tb_emp where sal<3000; --->还可以读到最开始使用select使用此命令读到的内容
    commit
    展开全文
  • 需求:保证数据库某个字段唯一(不改数据库结构) 这里是引用
  • 数据库数据完整性

    2019-10-01 11:23:55
    数据库 保证数据的完整性 保证数据的完整性 要点: 1为什么要保证数据的完整性:防止存储垃圾数据,从而影响数据库的执行效率。 2 完整性的分类:实体、域、引用、用户自定义。 3实现实体完整性的方法:...
  • 为什么数据库中的自动增长autoincreament可以保证数据不重复呢?
  • 强制域有效性的方法有:限制类型(通过数据类型)、格式(通过检查约束)、或可能值的范围(通过外键约束、检查约束、默认值定义、非空约束)。 3.应用完整性:我们必须在有关联的表中,确保
  • 而为了保证数据的有效性和准确性,就需要在创建表时给表中添加约束(当然也可以后续添加)。 数据库完整性的分类: 实体完整性(行完整性) 域完整性(列完整性) 引用完整性(关联表完整性) 约束...
  • 数据完整性的作用:保证用户输入的数据保存到数据库中是正确的。确保数据的完整性 = 在创建表时给表中添加约束完整性的分类:实体完整性、域完整性、引用完整性 一、实体完整性实体:即表中的一行(一条记录)代表一...
  • 数据库数据完整性

    2018-10-10 19:51:48
    二、如何保证数据的完整性? 三、完整性约束分类? 四、实体完整性 1.什么是实体完整性? 2.实体完整性约束有哪些? 3.主键约束 4.唯一约束 5.主键自增 五、域完整性 1.什么是域完整性? 2.域的约束有哪些...
  • 实体完整性:保证数据的非空、唯一、不重复。即要求=每个表中只有一个主键,主键必须唯一且不为空。 例如学籍关系表中的学号必须唯一,且部位空,否则无法对学籍信息进行操作。 域完整性:每个表中的列必须满足特定...
  • 一、数据库约束是为了保证数据的完整性(正确性)而实现的一套机制 1、非空约束not null 2、主键约束(PK) primary key constraint 唯一且不为空 3、唯一约束 (UQ)unique constraint 唯一,允许为空,但只能出现...
  • 优化大量并发写入所带来的性能问题),通过垂直拆分以及水平拆分的方式,将数据分到多个库和多个表中去应对的,即现在是这样的一套分布式存储结构。 数据库分库分表那篇也讲到了,使用了分库分...
  • 在高并发场景中,经常会遇到并发重复数据插入,没有唯一索引(比如有逻辑删除)却要保证唯一性的问题。比如分布式告警计算中,多个计算实例同时计算出同一个告警并同时插入相同的告警记录到数据库中,这时应该只插入...
  • 订单流水号一般都以日期+类别+编码,如201702190001,以...若插入前通过select * from order for update语句将表锁定,虽能保证订单流水号的唯一性,确降低了数据库的执行效率,在数据交互量大的情况下尤为明显。设计
  • 指表中行的完整性,主要用于保证操作的数据(记录)非空、唯一且不重复。 【非空约束、唯一约束、主键约束】 (2) 域完整性: 指表中列的完整性,必须满足某种特定的数据类型或约束。 【默认约束、检查约束、非空...
  • 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识...
  • 数据库中的数据完整性 ...主键约束(primary key):每个表中都要有一个主键,数据唯一,且能为 null 唯一约束(unique):数据不能重复,可以为 null(因为 null 不相等) 自增约束(auto_increment)
  • 数据库唯一序列号生成方案

    千次阅读 2017-12-22 14:49:23
    首先,我们得知道为什么需要制定数据库唯一序列号生成方案,难道MySQL的主键自增长不好用吗?当然不是。由于现在的业务数据量越来越大,有时候将数据放在一张表里,压力非常大,所以要进行分库分表。一旦进行了分库...
  • day17 二、约束 <1>数据完整性 作用:保证用户输入的数据保存到数据库中是正确的 实质:创建表的时候给表中的字段...特点:数据唯一,且不能为null 主关键字可以是表中的一个字段或者多个字段,它的值用来唯一标
  • mysql数据库之数据表操作: 1、如何创建数据表; 2、PRIMARY KEY(主键约束); 3、UNIQUE KEY(唯一约束)...1、约束保证数据的完整性和一致性; 2、约束分为表级约束和列级约束; 3、约束类型包括:  NOT NULL(非空约束
  • 一、概念:对表中的数据进行限定,保证输的格式正确性、有效性和完整性。 二、分类: 1、主键约束:primary key (1)注意: a.主键默认隐含非空条件和唯一条件 b.一张表只能有一个字段为主键。 c.主键就是...
  • /*约束:对表中的数据进行限定,保证数据的正确性、有效性和完整性 分类:1、主键约束:primary key 2、非空约束:not null 3、唯一约束:unique 4、外键约束:foreign key */ /*非空约束:not null*/ /*创建表...
  • 保证记录的唯一性 可以为null 每张表可以存在多个唯一约束 其中,username就是unique key。 默认约束:default 即没有赋值的情况下,系统自动赋默认值. 首先,创建数据表tb6,并将sex字段(类似集合...
  • 也许是我没说清楚, 后面有个同学说得对, 说白了就是多服务器下并发插入的问题, 如何能做到并发插入时保证数据唯一 下面是大家的一些方案(排名不分先后<img src="/images/smiles/icon_biggrin.gif"/> ), ...
  • 我们可以给表创建主键约束吗,主键保证数据唯一性,主键可以保证同一条记录只能插入一次。 一般情况下,只有一个字段可以添加主键,此字段一般是编号 2.域完整性 一般是对一个字段的约束 例如:学号 位数...
  • 数据完整性是为了保证插入到数据库中的数据是正确的,防止用户可能的错误输入。 数据完整性分为实体完整性、域完整性、参照完整性。 2.1实体(行)完整性 (实体完整性中的实体指的是表中的行,因为一行记录对应一个...
  • 数据库

    2021-04-15 23:10:22
    数据库索引: ...通过创建唯一性索引,可以保证数据库表中每一行数据唯一性 可以大大加快数据的检索速度 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义 在使用分组和排序子
  • 一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如身份证号字段重复,而其他字段不一定重复或都重复可以忽略,毕竟我们只要保证身份证号在表中数据唯一。 解决方法: (1)完全重复的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,943
精华内容 1,177
关键字:

数据库保证数据唯一