精华内容
下载资源
问答
  • 猿们好,我是honery,今天来给大家唠一唠如何避免数据库报唯一性约束的错误。一、问题的引出首先抛出一个问题,如何保证数据库表中的某列的值都不一样呢?相信大家很容易想到给该列加上唯一性约束,这样就能保证业务...

    猿们好,我是honery,今天来给大家唠一唠如何避免数据库报唯一性约束的错误。

    一、问题的引出

    首先抛出一个问题,如何保证数据库表中的某列的值都不一样呢?相信大家很容易想到给该列加上唯一性约束,这样就能保证业务逻辑的正确性了。实际的使用中,尤其高并发场景下,很容易出现插入同一条记录的情况,该情况下数据库会报违反唯一性约束的错误。总不能让数据库一直抛这个错误吧。于是我们想到可以在业务代码中加上该列值是否为空的判断,判断为空时再行插入,于是问题就解决了。

    问题真的解决了吗?说是,你就too young too simple了。有没考虑过高并发场景呢?如果多个线程同时在某次插入前去判空,显然判断的结果都是空,那么第一次插入成功后,后续的插入动作都会报违反数据库唯一性约束的错误。总不能让日志一直报错吧,该如何解决呢?

    二、问题的解决方案

    这个问题其实是个典型的问题,可以有很多种解决方案,小编这里就简单提供三种解决策略。方案很简单,猿们跟上思路~~

    2.1 通过锁机制,将查询和插入原子化

    相信很多小伙伴很容易就能想到这个方案,通过锁机制(如内置锁,synchronized)将记录是否存在的查询动作和插入新记录的动作放在一个同步锁中,实现的关键代码如下:

    @Transactional

    public synchronized void insertWhenIdIsEmpty(Qingmj qingmj) {

    log.info("进入时间:"+System.currentTimeMillis());

    log.info(qingmj.toString());

    Qingmj qingmj_old = qingmjMapper.getQingmjById(qingmj.getId());

    try {

    //等待10s,制造并发场景

    Thread.sleep(15000);

    } catch (InterruptedException e) {

    log.warn("睡眠等待过程异常",e);

    }

    if(qingmj_old==null) {

    log.info("数据准备插入中... ...");

    try {

    qingmjMapper.insert(qingmj);

    log.info("数据插入成功!");

    }catch(Exception e) {

    log.info("数据插入失败",e);

    }

    }else {

    log.info("约束键已存在,不再插入");

    }

    log.info("结束时间:"+System.currentTimeMillis());

    }

    [执行结果]:

    ef07d5a95982f5bb7e309a1e4e30ef27.png

    [结果分析]:

    从执行结果可知,通过锁机制将查询和插入原子化后,彻底的避免了插入重复数据的问题。但是带来了一个新问题,同步锁将两个业务动作锁在一起,强制执行过程串行化,会导致系统运行的性能较差,该如何优化呢?

    2.2 通过双重检查锁机制,优化串行化带来的性能问题

    所谓的双重检查锁机制,从名字不难看出其逻辑。它主要有两个技术点:一、将方法锁细化成代码块锁,尽量减少锁住的执行逻辑;二、执行两次判空逻辑,即在同步代码块中再加入一次判空检查。具体的代码实现如下:

    //@Transactional

    public void insertWhenIdIsEmpty(Qingmj qingmj) {

    log.info("进入时间:"+System.currentTimeMillis());

    log.info(qingmj.toString());

    Qingmj qingmj_old = qingmjMapper.getQingmjById(qingmj.getId());

    try {

    //等待10s,制造并发场景

    Thread.sleep(15000);

    } catch (InterruptedException e) {

    log.warn("睡眠等待过程异常",e);

    }

    if(qingmj_old==null) {

    synchronized (this) {

    Qingmj qingmj_old_2 = qingmjMapper.getQingmjById(qingmj.getId());

    if(qingmj_old_2==null) {

    log.info("数据准备插入中... ...");

    try {

    qingmjMapper.insert(qingmj);

    log.info("数据插入成功!");

    }catch(Exception e) {

    log.info("数据插入失败",e);

    }

    }else {

    log.info("约束键发现变为存在状态,不再插入");

    }

    }

    }else {

    log.info("约束键已存在,不再插入");

    }

    log.info("结束时间:"+System.currentTimeMillis());

    }

    [执行结果]:

    4d5c8b46465559396e9a5ab227b43354.png

    [结果分析]:

    引入双重检查锁机制,有效优化了同步方法锁性能较差的问题,是一种较为推荐的方法。这也是单例模式中懒汉模式的一种经典实现。代码中的事务注解不能在此处方法上加上,否则会适得其反,这也是锁与事务作用范围的一个角逐。好了,回到正题,解决违反数据库唯一性约束问题,能不能不加锁呢?答案是肯定的。

    2.3 通过巧用Redis的setnx特性,避免重复数据的插入

    我们要解决的问题是业务流程正常,但数据库会持续的报违反唯一性约束的问题。如何保留数据库的唯一性约束,维持业务流程正常,但同时不让数据库报上述异常呢?顺着这个思路我们可以想到能否在数据进入数据库之前就识别出重复数据的冲突呢?这样便可以解决上述问题了。有很多第三方的中间件可以帮我们做到这点,其中Redis就是一个例子。

    大家都用过Redis,知道Redis的setnx方法有个特点,当第一次插入某个key及其value值时会返回“1”;当后续继续插入该key的其他value值时会返回“0”,并插入失败。于是乎,我们在插入数据库之前,先将数据存入Redis当中,若Redis反馈为第一次插入则落地数据库中;若Redis反馈非第一次插入则不落地数据库。如此便巧妙解决了数据库报唯一性约束的问题了,而且!没有用到锁!具体实现如下:

    @Transactional

    public void insertWhenIdIsEmpty(Qingmj qingmj) {

    log.info("进入时间:"+System.currentTimeMillis());

    log.info(Thread.currentThread().getName() + " parameters:" + qingmj.toString());

    Qingmj qingmj_old = qingmjMapper.getQingmjById(qingmj.getId());

    try {

    //等待10s,制造并发场景

    Thread.sleep(15000);

    } catch (InterruptedException e) {

    log.warn("睡眠等待过程异常",e);

    }

    if(qingmj_old==null){

    if(redisUtil_test.setnx("constraint_id_"+qingmj.getId(), qingmj.getId()) == 1){//如果数据存在则返回0,不存在返回1

    log.info("数据准备插入中... ...");

    try {

    qingmjMapper.insert(qingmj);

    log.info("数据插入成功!");

    redisUtil_test.expire("constraint_id_"+qingmj.getId(), 1000);//设失效时间3秒

    }catch(Exception e) {

    redisUtil_test.del("constraint_id_"+qingmj.getId());//插入出异常则删除

    log.info("数据插入失败",e);

    }

    }else{

    log.info("并发情形,约束键已存在,不再插入");

    }

    }else{

    log.info("约束键已存在,不再插入");

    }

    log.info("结束时间:"+System.currentTimeMillis());

    }

    [执行结果]:

    ba755226bcda755b84b2a37592ebae20.png

    [结果分析]:

    通过巧用Redis的setnx特性有效解决了数据库持续报违反唯一性约束的错误。同时没有使用同步锁,大大提升了系统的性能。这种方法甚至在表字段未加唯一性约束的情况下,也能保证业务逻辑的正确性,非常巧妙且灵活。当然系统也必须要支持Redis才能采用这种方案啦。

    三、总结

    数据库违反唯一性约束问题,只是一个典型的小问题,解决方案特别多,大家都可以去借鉴。但是小编文中陈述的三种方案汇聚了解决这类问题的两个思路。其一是加锁,锁性能优化;其二是不加锁,在落地数据库之前提前引发数据冲突。方案虽说简单,但是值得回味的。

    展开全文
  • 唯一性约束 可以为null但不能重复 添加unique 这样叫列级约束 如下代码所示,在定义时添加unique,此时添加了的字段均不能接受相同数据的赋值 mysql> create table t_user(id int,username varchar(255) unique,...

    开始时间:2020-03-11

    唯一性约束

    可以为null但不能重复
    添加unique
    这样叫列级约束
    如下代码所示,在定义时添加unique,此时添加了的字段均不能接受相同数据的赋值

    mysql> create table t_user(id int,username varchar(255) unique,usercode varchar(255) unique);
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> desc t_user;
    +----------+--------------+------+-----+---------+-------+
    | Field    | Type         | Null | Key | Default | Extra |
    +----------+--------------+------+-----+---------+-------+
    | id       | int(11)      | YES  |     | NULL    |       |
    | username | varchar(255) | YES  | UNI | NULL    |       |
    | usercode | varchar(255) | YES  | UNI | NULL    |       |
    +----------+--------------+------+-----+---------+-------+
    

    报错

    mysql> insert into t_user(id,username,usercode)values(15,'zhangsan','23');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t_user(id,username,usercode)values(15,'zhangsan','25');
    ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'username'
    
    mysql> insert into t_user(id,username,usercode)values(15,'zhangn','23');
    ERROR 1062 (23000): Duplicate entry '23' for key 'usercode'
    
    

    注意和以下代码的区别:

    多个字段联合约束,这种叫表级约束

    mysql> create table t_user2(id int,username varchar(255),usercode varchar(255),
    unique(username,usercode));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> desc t_user2;
    +----------+--------------+------+-----+---------+-------+
    | Field    | Type         | Null | Key | Default | Extra |
    +----------+--------------+------+-----+---------+-------+
    | id       | int(11)      | YES  |     | NULL    |       |
    | username | varchar(255) | YES  | MUL | NULL    |       |
    | usercode | varchar(255) | YES  |     | NULL    |       |
    +----------+--------------+------+-----+---------+-------+
    

    两个字段都一样,才报错

    mysql> insert into t_user2(id,username,usercode)values(15,'zhangsan','23');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t_user2(id,username,usercode)values(15,'zhangsan','25');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t_user2(id,username,usercode)values(15,'zhang','23');
    Query OK, 1 row affected (0.00 sec)
    //同时一样,才报错
    mysql> insert into t_user2(id,username,usercode)values(15,'zhangsan','23');
    ERROR 1062 (23000): Duplicate entry 'zhangsan-23' for key 'username'
    

    主键约束

    主键是某一行记录的唯一标识,相当于身份证号
    主键不能为空,也不能重复

    mysql> create table t_user(id int primary key,//也是列级约束
    name varchar(255),email varchar(255));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into t_user(id,name,email)values(12,'lisi','23@qq.com');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from t_user;
    +----+------+-----------+
    | id | name | email     |
    +----+------+-----------+
    | 12 | lisi | 23@qq.com |
    +----+------+-----------+
    1 row in set (0.00 sec)
    
    mysql> insert into t_user(id,name,email)values(12,'wangwui','23@qq.com');
    ERROR 1062 (23000): Duplicate entry '12' for key 'PRIMARY'
    
    mysql> insert into t_user(name,email)values('wangwui','23@qq.com');
    ERROR 1364 (HY000): Field 'id' doesn't have a default value
    
    主键约束 primary key
    主键字段 id
    主键值 12

    主健的分类

    • 根据主键字段的字段数量来划分:
      单一主键
      复合主键(多个字段联合起来添加一个主键约束)(不建议使用)
    • 根据主键性质来划分:
      自然主键:主键值和业务脱钩(用单纯的序号作为主键,防止换了业务后不再适用)
      业务主键:主键值和业务挂钩(身份证号作为主键)

    一张表的主键约束只能有1个。

    mysql提供主键自增,这样可以不用自己赋值了

    create table t_user(
    id int primary key auto_increment,//自增
    email varchar(255)
    )
    
    mysql> insert into t_user(email)values('123@qq.com');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t_user(email)values('13@qq.com');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t_user(email)values('23@qq.com');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t_user;
    +----+------------+
    | id | email      |
    +----+------------+
    |  1 | 123@qq.com |
    |  2 | 13@qq.com  |
    |  3 | 23@qq.com  |
    +----+------------+
    

    外键约束

    外键约束 foreign key
    外键字段 添加有外键约束的字段
    外键值 外键字段中的每一个值

    业务背景:
    请设计数据库表,用来维护学生和班级的信息?
    第一种方案:一张表存储所有数据

    no (pk) name classno classname
    1 zs1 101 北京大兴区经济技术开发区亦庄二中高三1班
    2 zs2 101 北京大兴区经济技术开发区亦庄二中高三1班
    3 zs3 102 北京大兴区经济技术开发区亦庄二中高三2班
    4 zs4 102 北京大兴区经济技术开发区亦庄二中高三2班
    5 zs5 102 北京大兴区经济技术开发区亦庄二中高三2班

    第二种方案:两张表存储数据
    父表:
    t_class 班级表

    cno cname
    101 北京大兴区经济技术开发区亦庄二中高三1班
    102 北京大兴区经济技术开发区亦庄二中高三2班

    子表:
    t_student

    sno sname classno(外键约束)
    1 zs1 101
    2 zs2 101
    3 zs3 102
    4 zs4 102
    5 zs5 102

    t_student中的classno字段引用t_class表中的cno字段
    此时t_student表叫做子表。t_class表叫做父表。
    顺序要求:
    删除数据的时候,先删除子表,再删除父表。
    添加数据的时候,先添加父表,在添加子表。
    创建表的时候,先创建父表,再创建子表。
    删除表的时候,先删除子表,在删除父表。

    //创建父表
    create table t_class( cno int, cname varchar(255),primary key(cno));
    
    //创建子表
    mysql> create table t_student(sno int,sname varchar(255),
    classno int,foreign key(classno) references t_class(cno));//利用foreign key来建立外键
    //通过写references来定位父类
    Query OK, 0 rows affected (0.02 sec)
    

    在此基础上添加数据

    mysql> insert into t_class values(101,'aaa');
    mysql> insert into t_class values(102,'bbba');
    mysql> insert into t_class values(103,'caa');
    mysql> insert into t_student values(1,'ls',101);
    mysql> insert into t_student values(2,'ls2',102)
    mysql> insert into t_student values(3,'wa2',103);
    mysql> insert into t_student values(4,'waza4',103);
    //注意,这里不能给101 102 103以外的值,因为t_class中只有这三个数据
    mysql> insert into t_student values(5,'aa4',105);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails 
    (`mysql`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
    
    mysql> select * from t_class;
    +-----+-------+
    | cno | cname |
    +-----+-------+
    | 101 | aaa   |
    | 102 | bbba  |
    | 103 | caa   |
    +-----+-------+
    3 rows in set (0.02 sec)
    
    mysql> select * from t_student;
    +------+-------+---------+
    | sno  | sname | classno |
    +------+-------+---------+
    |    1 | ls    |     101 |
    |    2 | ls2   |     102 |
    |    3 | wa2   |     103 |
    |    4 | waza4 |     103 |
    +------+-------+---------+
    

    写好的这些代码可以一口气放在一个sql文件里面,然后通过source的方式直接用
    Test.sql

    drop table if exists t_student;
    drop table if exists t_class;
    
    create table t_class( cno int, cname varchar(255),primary key(cno));
    create table t_student(sno int,sname varchar(255),
    classno int,foreign key(classno) references t_class(cno));
    
    insert into t_class values(101,'aaa');
    insert into t_class values(102,'bbba');
    insert into t_class values(103,'caa');
    insert into t_student values(1,'ls',101);
    insert into t_student values(2,'ls2',102);
    insert into t_student values(3,'wa2',103);
    insert into t_student values(4,'waza4',103);
    select * from t_class;
    select * from t_student;
    
    mysql> source F:\编程学习\MySQL_Course\bjpowernode\Test.sql
    Query OK, 0 rows affected (0.01 sec)
    
    +-----+-------+
    | cno | cname |
    +-----+-------+
    | 101 | aaa   |
    | 102 | bbba  |
    | 103 | caa   |
    +-----+-------+
    3 rows in set (0.00 sec)
    
    +------+-------+---------+
    | sno  | sname | classno |
    +------+-------+---------+
    |    1 | ls    |     101 |
    |    2 | ls2   |     102 |
    |    3 | wa2   |     103 |
    |    4 | waza4 |     103 |
    +------+-------+---------+
    4 rows in set (0.00 sec)
    

    外键可以为null

    mysql> insert t_student(sno,sname)values(2,'101');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t_student;
    +------+-------+---------+
    | sno  | sname | classno |
    +------+-------+---------+
    |    1 | ls    |     101 |
    |    2 | ls2   |     102 |
    |    3 | wa2   |     103 |
    |    4 | waza4 |     103 |
    |    2 | 101   |    NULL |
    +------+-------+---------+
    

    外键字段引用其他字段时,被引用字段一定是唯一键unique(不一定是主键)
    结束时间:2020-03-13

    展开全文
  • 约束 全称完整性约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,用来确保数据的准确性和一致性。索引 数据库中用的最频繁的操作是数据查询,索引就是为了加速表中数据行的检索而创建的一种...

    约束 全称完整性约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,用来确保数据的准确性和一致性。

    索引 数据库中用的最频繁的操作是数据查询,索引就是为了加速表中数据行的检索而创建的一种分散的数据结构。可以把索引类比成书的目录,有目录的肯定比没有目录的书,更方便查找。

    唯一约束 保证在一个字段或者一组字段里的数据都与表中其它行的对应数据不同。和主键约束不同,唯一约束允许为 NULL,只是只能有一行。

    唯一索引 不允许具有索引值相同的行,从而禁止重复的索引或键值。

    唯一约束和唯一索引都是为了保证表中被限制的字段不允许有重复的值,看起来功能是一样的,那为什么要设计这样两种一样的功能呢?

    首先创建两个字段值一样的表 t1,t2,并为 t1 表中的 col1 列设置唯一约束。

    CREATE TABLE t1 (

    col1 INT(11),

    col2 VARCHAR(20),

    CONSTRAINT t1_uq UNIQUE (col1)

    );

    CREATE TABLE t2 (

    col1 INT(11),

    col2 VARCHAR(20)

    );

    然后为表 t2 表中的 col1 列设置唯一索引

    CREATE UNIQUE INDEX

    t2_idx ON t2 (col1);

    创建表 t3,并将 t1 表中的 col1 列设置为 t3 表中 col2 列的外键

    CREATE TABLE t3 (

    col1 INT(11),

    col2 INT(11),

    col3 VARCHAR(20),

    CONSTRAINT t3_fk FOREIGN KEY (col2) REFERENCES t1 (col1)

    );

    到此为止,基本上就能得出,唯一约束和唯一索引在 MySQL 数据库里区别了

    概念上不同,约束是为了保证数据的完整性,索引是为了辅助查询;

    创建唯一约束时,会自动的创建唯一索引;

    在理论上,不一样,在实际使用时,基本没有区别。

    关于第二条,MySQL 中唯一约束是通过唯一索引实现的,为了保证没有重复值,在插入新记录时会再检索一遍,怎样检索快,当然是建索引了,所以,在创建唯一约束的时候就创建了唯一索引。

    4.唯一性索引

    如果确定某个数据列只包含彼此各不相同的值,在为这个数据列创建索引的时候,就应该用关键字UNIQUE把它定义为一个唯一索引,Mysql会在有新纪录插入数据表时,自动检查新纪录的这个字段的值是否已经在某个记录的这个字段里出现过了。如果是,mysql将拒绝插入那条新纪录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复

    5.索引的优点

    5.1.可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性

    5.2.建立索引可以大大提高检索的数据,以及减少表的检索行数

    5.3.在表连接的连接条件,可以加速表与表直接的相连

    5.4.在分组和排序字句进行数据检索,可以减少查询时间中分组和排序时所消耗的时间(数据库的记录会重新排序)

    5.5.建立索引,在查询中使用索引,可以提高性能。

    展开全文
  • JPA教程 - JPA表唯一约束示例我们可以用@Table注释添加表约束。下表为名称列上的Person表添加了唯一约束。@Entity@Table(uniqueConstraints=@UniqueConstraint(columnNames="NAME"))public class Person {例子下面的...

    JPA教程 - JPA表唯一约束示例

    我们可以用@Table注释添加表约束。

    下表为名称列上的Person表添加了唯一约束。

    @Entity

    @Table(uniqueConstraints=@UniqueConstraint(columnNames="NAME"))

    public class Person {

    例子

    下面的代码来自PersonDaoImpl.java。

    package cn.w3cschool.common;

    import java.util.Calendar;

    import java.util.List;

    import javax.persistence.EntityManager;

    import javax.persistence.PersistenceContext;

    import org.springframework.transaction.annotation.Transactional;

    @Transactional

    public class PersonDaoImpl {

    public void test(){

    Person p1 = new Person("Tom");

    p1.setId(1L);

    p1.setDob(Calendar.getInstance());

    Person p2 = new Person("Jack");

    p2.setId(2L);

    save(p1);

    save(p2);

    listAll();

    }

    private void listAll(){

    List persons = getAll();

    for (Person person : persons) {

    System.out.println(person);

    }

    }

    @PersistenceContext

    private EntityManager em;

    public Long save(Person person) {

    em.persist(person);

    return person.getId();

    }

    public ListgetAll() {

    return em.createQuery("SELECT p FROM Person p", Person.class).getResultList();

    }

    }

    下面的代码来自Person.java。

    package cn.w3cschool.common;

    import javax.persistence.Entity;

    import javax.persistence.Id;

    import javax.persistence.Table;

    import javax.persistence.Temporal;

    import javax.persistence.TemporalType;

    import javax.persistence.UniqueConstraint;

    @Entity

    @Table(uniqueConstraints=@UniqueConstraint(columnNames="NAME"))

    public class Person {

    @Id

    private long id;

    private String name;

    @Temporal(TemporalType.DATE)

    private java.util.Calendar dob;

    public Person() {}

    public Person(String name) {

    this.name = name;

    }

    public java.util.Calendar getDob() {

    return dob;

    }

    public void setDob(java.util.Calendar dob) {

    this.dob = dob;

    }

    public Long getId() {

    return id;

    }

    public void setId(Long id) {

    this.id = id;

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public String toString() {

    return "\n\nID:" + id + "\nName:" + name + "\n\n"+"Dob"+dob;

    }

    }

    Download Table_Unique_Constraint.zip

    上面的代码生成以下结果。

    b595899753edfa5938f70ea94ac696d3.png

    以下是数据库转储。

    Table Name: PERSON

    Row:

    Column Name: ID,

    Column Type: BIGINT:

    Column Value: 1

    Column Name: DOB,

    Column Type: DATE:

    Column Value: 2014-12-29

    Column Name: NAME,

    Column Type: VARCHAR:

    Column Value: Tom

    Row:

    Column Name: ID,

    Column Type: BIGINT:

    Column Value: 2

    Column Name: DOB,

    Column Type: DATE:

    Column Value: null

    Column Name: NAME,

    Column Type: VARCHAR:

    Column Value: Jack

    展开全文
  • 在表里设置字段唯一约束可以有效防止高并发时由业务代码处理引发的重复入库的问题。 具体建立唯一约束的方法:...1. 建表时加上唯一性约束 CREATE TABLE `t_user` ( `Id` int(11) NOT NULL AUTO_INCREMENT,-- 自增 ...
  • 猿们好,我是honery,今天来给大家唠一唠如何避免数据库报唯一性约束的错误。 一、问题的引出   首先抛出一个问题,如何保证数据库表中的某列的值都不一样呢?相信大家很容易想到给该列加上唯一性约束,这样就能...
  • 给MySQL 表设置唯一性约束方法

    千次阅读 2018-08-10 11:32:38
    今天学项目遇到一个业务增加品牌,一开始直接在业务代码里面加逻辑,在入库前先查一遍有没有,没有就入库,否则报错返回。...UNIQUE约束为列或列集合提供了唯一性的保证。 每个表可以有多个 UNIQUE 约束。 已...
  • 在使用Python从小熊同学的API中提取基金净值后,导入到SQLite数据库时,考虑到避免重复导入同一...经过查看菜鸟教程,多字段的唯一性约束需要在建表的时候就在代码中指定。因此代码如下: CREATE TABLE 产品库 ( ID
  • 一丶 主键 USE EMIS301 GO ALTER TABLE 系部 ADD CONSTRAINT PK_专业 PRIMARY KEY(系部名称) GO 二丶 外键 USE EMIS301 GO ALTER TABLE 系部 ADD CONSTRAINT FK_系部_专业 FOREIGN ...三丶 唯一性约束 USE EMIS30...
  • QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例 部分代码: // 创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束 QMenu *pDialog = mBar->addMenu(QString::fromLocal8Bit...
  • 就是支持Excel导入的功能,导入第二次同模板不同数据时,报错,违反唯一性约束。就死活用不了了,重启Tomcat才能恢复使用。但只能到一个文件 分析需要重启Tomcat,应该是缓存的原因 原因分析完所有代码,临时数据...
  • 一、现象及原因今天在PostgreSQL又遇到一个现象,应用代码报错:“ERROR: duplicate key value violates unique constraint ...”。最后查明,这是由于PostgreSQL把空串('')、空值(NULL)当作不同的值,从而影响了...
  • 今天在PostgreSQL又遇到一个现象,应用代码报错:“ERROR: duplicate key value violates unique constraint ...”。最后查明,这是由于PostgreSQL把空串('')、空值(NULL)当作不同的值,从而影响了那些没有申明为NOT...
  • 根据错误代码中提示,应该是id有了唯一性约束的问题,最后将当前insert语句放在db2中执行后,仍有此问题,因此断定id字段有问题。由于id字段是自增字段,在网上查了相关信息,有实例说明是因为在id字段不小心将其...
  • --使用代码创建数据完整:--主键约束(primary key PK) 唯一约束(unique UQ) 默认值约束(default DF) check约束(check CK) 主外键约束(foreign key FK)--语法:--alter table 表名--add constraint 约束名称(前缀...
  • 隐式bug指代码内部设定的边界值或规则导致的bug,从纯黑盒分析来看,很难分析到该问题,需要白盒测试或灰盒测试才能发现: 测试点:同步功能,同步时自动创建一个用户名,开发在处理该项功能时,创建的用户名使用的...
  • 在说明问题之前我们先来看一段经常性使用的代码function fun(){开启事务try{var count = find();if(count<...我们很当然的认为这很完美,我在代码中进行了唯一性验证,数据表中肯定不会存在相同的...
  • MySQL 表字段唯一性约束设置unique 前言:前段时间接手了同事的一块代码,开发过程中,前端说登录账号时报以上错误,写个记录吧。 分析: mybatis中使用的selectOne()方法,由于只能返回一个对象的结果,当返回到...
  • 保证字段值得唯一性。   二 唯一约束和主键约束的区别 主键字段值必须是非空的。 唯一约束允许有一个空值。 主键在每张表中只能有一个。 唯一约束在每张表中可以有多个。   三 在创建表时设置唯一约束 1...
  • 比如如下代码, 我们要保证 openid是唯一的, 保存到数据库里的数据不会有重复.​ /** * A WxUser. */ @Entity @Table(name = "wx_user") @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) ...
  • Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C003139) at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459) at oracle.jdbc.driver....
  • 表的完整性约束-外键约束 外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。 外键是指表中某个...
  • 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。话不多说,一起来学习吧!1、目录今天学习的主要内容有MySQL 约束分类主键约束默认值约束唯一约束外键约束非空约束2、知识点...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 402
精华内容 160
关键字:

唯一性约束代码