精华内容
下载资源
问答
  • SQL唯一键unique

    千次阅读 2019-03-18 11:30:48
    唯一键unique key)就可以解决表中有多个字段需要唯一性约束的问题。唯一键的本质与主键差不多,唯一键默认的允许自动为空,而且可以多个为空(因为字段为空不参与唯一性比较)。 增加唯一键 基本与主键差不多,...

           一张表往往有很多字段需要具有唯一性,数据不能重复,但是一张表中只能有一个主键。唯一键(unique key)就可以解决表中有多个字段需要唯一性约束的问题。唯一键的本质与主键差不多,唯一键默认的允许自动为空,而且可以多个为空(因为字段为空不参与唯一性比较)。


    增加唯一键


    基本与主键差不多,也有三种方法。

    方案1:在创建表的时候,字段之后直接跟unique关键字


    看到Key列下显示UNI就表示unique,代表唯一性生效了。


    方案2:在所有的字段之后增加unique key(字段列表); -- 支持复合唯一键


           上面显示PRI,其实不是主键,原因是:这里number刚好是一个不为空的唯一键(主键性质一样),真实原因是该表没有主键,系统自动给添加上去的。具体你可以使用下面show create table命令查看。



    方案3:在创建表之后增加唯一键


    上面先是创建一个没有唯一键的表,然后通过追加的方式给number添加唯一键属性。


    唯一键约束


    唯一键和主键本质相同,唯一区别是唯一键允许为空,而且多个字段允许为空。


    举例,插入数据。


    查看表数据


    上面表示如果列属性有unique修饰,那么是允许为空,但是不能重复,下面来验证唯一性冲突检查。



    删除唯一键


    举例删除唯一键

    语法格式:alter table 表名drop index 索引名称;

    上面语法提到index,这个索引指的是什么呢,请看下图。


    执行删除唯一键操作


    展开全文
  • hibernate 批量保存数据时存在唯一键unique值重复时报错的解决方式 ( 主键策略为indentity时可用) 测试的数据库:mysql 其中Teacher的主键策略分别为以下几种 //Teacher1 -- native //Teacher2 -- hilo //...

    hibernate 批量保存数据时存在唯一键unique值重复时报错的解决方式 ( 主键策略为indentity时可用)

    测试的数据库:mysql
    其中Teacher的主键策略分别为以下几种
    //Teacher1  -- native
    //Teacher2  -- hilo
    //Teacher3  -- indentity
    //Teacher4  -- increment
    4种主键策略的测试结果:主键方式仅native或indentity可以完成该操作
    

    测试的项目文件:

    点击进入项目资源链接页

    在进行保存具有重复的唯一键值时出现以下错误:

    错误代码:org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 1062, SQLState: 23000

    an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null id in xxx entry (don’t flush the Session after an exception occurs)

    本来以为解决不了了,通过后台程序实现这个功能:就是通过从数据库中取得已存在的数据对象集合与excel表获得的对象集合进行比较,如果存在则移除excel表取得的数据集合对象中的该对象(只保存未存在的数据场景,根据教工号判断)或者对该对象进行Oid赋值(保存未存在的数据、已存在的数据进行更新的场景),然后在for遍历这个excel的集合对象进行使用session.save()或者session.saveOrUpdate()方法。

    后来发现junit中未报错,数据库表中却多出来一条记录,使用debug发现有一个实体类对象为null,进行了保存,然后发现自己模拟的对象集合的引用对象写错了,更正之后可以进行正确的保存操作了。经测试:在try代码块中未使用session.flush()两种方案均能解决错误问题,且数据能进行保存。

    如果批量插入数据较多在一定数量时可以进行if(index % 20 == 0){session.flush(); session.clear();} ,只有方案一能够使用,方案二将会仍出现该错误。 以下就是我的解决方案,可以正常使用,不过目前博主对session.clear();有所疑惑,我觉得它当前场景(catch中)的作用是将该重复的实体对象从session中清除了。如果有正确的观点或其他见解,欢迎各位看官不吝指教~

    解决方案一: 可以在操作一定数量时进行调用session.flush(); session.clear();

    使用session.clear();

    //session获取、事务开启
    for(Entity e: es){
            try{  //新数据进行保存操作
                session.save(e);
    
            }catch(ConstraintViolationException e){  //唯一键重复时
                session.clear();
    
            }
    
        }
    //最后session关闭、事务提交
    

    解决方案二:不适合使用在一定数量时调用session.flush(); session.clear(); 的场景,否则仍会报出该错误

    设置session.setFlushMode(FlushMode.NEVER);

    //session获取、事务开启
    session.setFlushMode(FlushMode.NEVER);
    for(Entity e: es){
        try{  //新数据进行保存操作
            session.save(e);
        }catch(ConstraintViolationException e){  //唯一键重复时           
        }
    }
        //最后session关闭、事务提交
    

    其中可在catch中进行重复数据的处理操作,比如更新。Entity e 是指实体类对象,es是指该实体类的集合。假设e指teacher,该实体类包括主键id,教工号是唯一键,备注等。

    下面使用第一种进行介绍更新操作:

    
        Session session = xxx.openSession();        //获取session,具体session怎么获取就不介绍了
    
        Transaction transaction = session.beginTransaction();  //开启事务
    
        for(Entity e: es){   //遍历该对象数据集合,具体数据就不模拟了
    
                try{
                    session.save(e);
    
                }catch(ConstraintViolationException e){  //已存在的数据
                    session.clear();  
                    Integer id = (Integer) session.createQuery("select 
                    id from Teacher where teacherNo = ?")
                    .setString(0, e.getTeacherNo()).uniqueResult();  //首先获取该重复对象的oid
                    e.setId(id);  //设置游离对象
                    e.setMemo("重复唯一键");    
                    session.update(e);  
                    session.flush();  //刷新缓存,同步更新数据库
                }
    
            }
    
    
            transaction.commit();   //提交事务  
    
            session.close();    // 关闭Session

    以上只是我找到的解决办法,且仅凭自己初步理解难免有错误,如果有更好见解或有所指教,欢迎各位指出。

    展开全文
  • 一、列属性概述 1、真正约束字段的是数据类型,但数据类型的约束很单一,需要一些额外的...在MySQL中,一共有6个列属性:null/not null、comment、default、primary key、auto_increment、unique key 二、空属性 ...

    一、列属性概述

    1、真正约束字段的是数据类型,但数据类型的约束很单一,需要一些额外的约束,来更加保证数据的合法性

    2、属性是描述表中字段的,一开始就定义好了,不是使用过程中才有的

    3、列属性又称之为字段属性。在MySQL中,一共有6个列属性:null/not null、comment、default、primary key、auto_increment、unique key

    二、空属性

    1、空属性有两个值:null(默认)、not null(不为空)

    2、数据库的字段基本都默认为空。但在实际开发中,要尽可能保证所有的数据都不为空。因为空数据没有意义,且空数据无法参与运算

    注:任何数据碰到null的结果都是null,null没有意义

        -- 创建表
        create table my_class(
            name varchar(20) not null,
            room varchar(20) null    -- null代表允许为空。不写默认就是允许为空
        )charset utf8;
    
        -- 查看表结构
        desc my_class;

    三、列描述

    1、列描述:comment。没有实际意义,是专门用来描述字段的,是帮助开发人员进行维护的注释说明

    2、列描述会跟随表创建语句保存,通过查看表创建语句查看列描述

    注:和注释的不同之处在于:注释不会写入表中

        -- 创建表
        create table my_teacher(
            name varchar(20) not null comment '姓名',
            money decimal(10, 2) not null comment '工资'
        )charset utf8;
    
        -- 查看表结构
        desc my_teacher;
    
        -- 查看表创建语句,查看列描述
        show create table my_teacher;

    3、列描述comment存在的价值就是给别人也给自己提供方便,让以后再查看表的人可以很清楚的看到当前字段设计者的用意是什么

    四、默认值

    1、默认值:default。某一种数据会经常性的出现某个具体的值,可以在一开始就指定好。在需要真实数据的时候,用户可以选择性的使用默认值。或者是 字段被设计时,如果允许默认条件下用户不进行数据的插入,那么就可以使用默认值进行填充,通常填充的是null

        -- 创建表
        create table my_default(
            name varchar(20) not null,
            age tinyint unsigned default 0,    -- default是默认值
            gender enum('男', '女', '保密') default '男'
        )charset utf8;
    
        -- 查看表结构
        desc my_default;

    2、使用默认值

    (1)在进行数据插入的时候,不给该字段赋值,就会使用默认值(省略带有默认值的字段)

        -- 插入数据,使用默认值(省略带有默认值的字段)
        insert into my_default (name) values ('小强');

    (2)使用default关键字代替值(使用带有默认值的字段,但其值用default代替),显式告知字段使用默认值

    注:如果字段很多,为了一个字段不要(默认值)而写了很多字段,得不偿失。但又想让这个字段使用默认值,此时就可以使用default关键字来触发默认值

        -- 插入数据,使用默认值(使用带有默认值的字段,但其值用default代替)
        insert into my_default values ('张三', 18, default);

    五、主键

    1、主键:primary key。一张表只能有一个字段可以使用主键,用来唯一的约束该字段里面的数据不能重复。即 一张表最多只能有一个主键(非空、唯一)

    2、增加主键

          SQL操作中有三种方式可以给表增加主键

    (1)方式一:在创建表的时候,直接在字段之后跟"primary key"关键字(主键本身不能为空)

        -- 增加主键
        create table my_pri1(
            name varchar(20) not null comment '姓名',
            number char(10) primary key comment '学号:itcast + xxxx,不能重复'
        )charset utf8;
    
        -- 查看表结构
        desc my_pri1;

    注:此方式的优缺点:

    a). 优点:非常直接

    b). 缺点:只能使用一个字段作为主键

    说明:被系统优化后存储的表创建语句,主键有了额外的一行在其中存储。即 在所有字段之后,加 primary key(主键字段列表)

    (2)方式二:在创建表的时候,在所有字段之后,使用"primary key(主键字段列表)"来创建主键。如果有多个字段作为主键,可以是复合主键(复合主键用的不多)

        -- 复合主键
        create table my_pri2(
            number char(10) comment '学号:itcast + xxxx',
            course char(10) comment '课程代码:xxxx + xxxx',
            score tinyint unsigned default 60 comment '成绩',
            -- 增加主键限制:学号和课程代码应该是对应的,具有唯一性
            primary key(number, course)
        )charset utf8;
    
        -- 查看表结构
        desc my_pri2;

    注:

    a). 主键的作用:限制数据

    b). 一个表中最多只能有一个主键。如果表中出现两个PRI,一定是复合主键

    (3)方式三:当表已经创建好之后,额外追加主键。可以通过修改表字段属性,也可以直接追加

        -- 追加主键:通过修改表字段属性
        alter table 表名 modify 字段名 列类型 primary key;
    
        -- 追加主键:直接追加
        alter table 表名 add primary key(字段列表);
        -- 追加主键
        create table my_pri3(
            course char(10) not null comment '课程编号:xxxx + xxxx',
            name varchar(10) not null comment '课程名称'
        )charset utf8;
    
        -- 查看表结构
        desc my_pri3;
        
        -- 追加主键
        -- 方式一:通过修改表字段属性
        alter table my_pri3 modify course char(10) primary key comment '课程编号:xxxx + xxxx';
        -- 方式二:直接追加
        alter table my_pri3 add primary key(course);
    
        -- 查看表结构
        desc my_pri3;

    注:此方式有前提:表中字段对应的数据本身是独立的(不重复)。如果数据有重复值,主键插不进去

    3、主键约束

    (1)主键对应的字段中的数据不能为空

    (2)主键对应的字段中的数据不允许重复。一旦重复,数据操作失败(增和改)-- 保证数据的唯一性

    4、更新主键&删除主键

    (1)没有办法更新主键。主键必须先删除,才能增加

    (2)删除主键

        -- 删除主键
        alter table 表名 drop primary key;    -- 可以这样是因为:一个表只有一个主键

    注:

    (1)一个字段本来是可以为空的。将其设为主键后,该字段变成了非空、唯一。删除主键,只把唯一去掉了,该字段还是非空的,没有恢复成最开始的可以为空

    (2)主键一般搭配自增长。如果主键是自增长的,则删除主键时,要先删除自增长(自增长不能脱离索引存在)

    5、主键分类

    (1)主键分为两类:业务主键和逻辑主键(逻辑主键较常用)

    (2)在实际创建表的过程中,很少使用真实的业务数据作为主键字段(业务主键,eg:学号、课程号等)。大部分时候,使用逻辑性的字段作为主键,这种主键称为逻辑主键

    (3)逻辑主键没有业务意义,值是什么都没有关系。但它有唯一性,能够区分当前记录。基本上会为每一张表增加一个逻辑主键来保证数据的唯一性

    注:主键的作用是为了保证数据的唯一性,不冲突即可

        -- 创建表,使用逻辑主键
        create table my_student(
            id int primary key auto_increment comment '逻辑主键:自增长',    -- 逻辑主键
            number char(10) not null comment '学号',
            name varchar(10) not null
        );

    六、自动增长

    1、自增长:auto_increment。当自增长的字段 不给值 | 给null值 | 给默认值 的时候,自增长会自动的被系统触发。系统会将当前字段已有的最大值进行+1操作,得到一个新的不同的值

    注:自增长通常和逻辑主键搭配使用

    2、新增自增长

    (1)自增长的特点

    a). 任何一个字段要做自增长,前提是该字段本身是一个索引(key一栏有值)

    注:索引不一定是主键,但主键一定是索引,叫主键索引。key一栏代表索引,任何出现在这一栏的都是索引

    b). 自增长字段必须是数字(整型)

    c). 一张表最多只能有一个自增长

    d). 绝大多数情况下,自增长搭配的是逻辑主键

    (2)方式一:在创建表的时候,在字段属性之后跟"auto_increment"关键字

        -- 自增长
        create table my_auto(
            -- 自增长:(1)是索引;(2)是整型;(3)一张表只有一个;(4)通常搭配主键使用
            id int primary key auto_increment comment '自动增长',
            name varchar(10) not null
        )charset utf8;
    
        -- 查看表结构
        desc my_auto;

    (3)方式二:当表已经创建好之后,给已有字段追加自增长

        -- 给已有字段追加自增长
        alter table 表名 modify 字段名 列类型 auto_increment;

    3、自增长的使用

    (1)当自增长没有被给值,或被给定的值为 null或默认值 的时候(不给值 | 给null值 | 给默认值),会触发自动增长

        -- 触发自增长:不给值
        insert into my_auto (name) values ('张三');
    
        -- 触发自增长:给null值
        insert into my_auto values (null, '李四');
    
        -- 触发自增长:给默认值
        insert into my_auto values (default, '王五');
    
        -- 查看表数据
        select * from my_auto;

    注:自增长的第一个元素默认为1,且每次都是自增1

    (2)自增长对应的字段如果输入了值,那么自增长失效。但下一次还是能够正确的自增长,从最大值+1开始自增

    注:修改自增长字段的数据 < 自增长的值,是可以的。但下次自增长的值(表选项中的auto_increment的值)不会被改变

        -- 指定数据
        insert into my_auto values (6, '赵六');
    
        insert into my_auto values (null, '赵四方');
    
        -- 查看表数据
        select * from my_auto;

    (3)如何确定下一次自增长的值?可以通过查看表创建语句得到

    4、修改自增长

    (1)自增长如果涉及到字段改变(把自增长改到另外一个字段上),必须先删除自增长,后新增(一张表只能有一个自增长)

    注:自增长一旦触发使用之后,会自动的在表选项中增加一个选项。如果有多个自增长字段,表选项中就会有多个值,修改自增长时就无法区分。所以,自增长字段只能有一个

    (2)修改当前自增长已经存在的值,修改后的值必须比当前已有的自增长的最大值大,不能小(小不报错,但修改无效)

    注:修改后的值为下一个自增长的值,可以通过表创建语句查看

        -- 修改当前自增长已经存在的值(修改表选项)
        alter table 表名 auto_increment = 值;
    
        -- 修改自增长的值
        alter table my_auto auto_increment = 10;
    
        -- 查看表创建语句
        show create table my_auto;

    (3)为什么自增长是从1开始的?为什么每次都是自增1?

             系统所有的表现(eg:字符集、校对集等)都是由系统内部的变量进行控制的,可以修改变量实现不同的效果(修改是对整个数据库修改,而不是单张表。修改是会话级别的,当前客户端、当次连接有效,关闭失效)

        -- 查看自增长对应的变量
        show variables like 'auto_increment%';
    
        -- 修改自增长步长(会话级别)
        set auto_increment_increment = 5;
    
        -- 修改自增长起始值(会话级别)
        set auto_increment_offset = 2;

    5、删除自增长

    (1)自增长是字段的一个属性,可以用modify进行修改。删除自增长,就是在字段属性之后不再保留auto_increment。当用户修改自增长所在字段时,如果没有看到auto_increment属性,系统会自动清除该自增长

        -- 删除自增长
        alter table 表名 modify 字段名 列类型;
    
        alter table my_auto modify id int primary key;    -- 错误
        alter table my_auto modify id int;    -- 有主键的时候,千万不要再增加主键

    注:被系统优化后存储的表创建语句,主键有了额外的一行在其中存储。在所有字段之后,加 primary key(主键字段列表)。modify时,如果再加上 primary key,相当于又增加了一个主键。而系统规定一张表只能有一个主键,所以会报错

    (2)如果主键是自增长的,则删除主键时,要先删除自增长(自增长不能脱离索引存在)

    6、细节问题

    (1)一张表中只能有一个自增长,自增长会上升到表选项中

    (2)创建表之后,如果表中还没有插入数据,自增长就还没有被触发,那么自增长不会表现(表选项中看不到auto_increment)

    (3)插入数据时给定了自增长的值A,如果 A<下一次自增长的值,则下一次自增长的值不变;如果 A>下一次自增长的值,则下一次自增长的值变成 A+1

    七、唯一键

    1、唯一键:unique key。用来保证对应的字段中的数据唯一。主键也可以用来保证字段数据唯一,但一张表中只能有一个主键

    (1)唯一键在一张表中可以有多个

    (2)唯一键允许字段数据为null,且可以有多个为null。null不参与唯一性比较(因为null与任何字段运算,结果都为null)

    注:一张表中只能有一个主键(非空、唯一),但是可以有多个唯一键(可以为空、唯一)

    2、增加唯一键

          和增加主键类似,增加唯一键也有三种方式

    (1)方式一:在创建表的时候,直接在字段之后跟"unique [key]"关键字

        -- 唯一键
        create table my_unique1(
            number char(10) unique comment '学号:唯一,允许为空',
            name varchar(10) not null
        )charset utf8;
    
        -- 查看表结构
        desc my_unique1;

    (2)方式二:在创建表的时候,在所有字段之后,增加"unique key(字段列表) "来创建唯一键(可以是复合唯一键)

        -- 唯一键
        create table my_unique2(
            number char(10) not null comment '学号',
            name varchar(20) not null,
            -- 增加唯一键
            unique key(number, name)
        )charset utf8;
    
        -- 查看表结构
        desc my_unique2;
    
        -- 查看表创建语句
        show create table my_unique2;

    注:如果一张表没有主键,且有一个或多个不为空的唯一键,则把第一个不为空的唯一键当作该表的主键(查看表创建语句即可看到真相)

    (3)方式三:当表已经创建好之后,额外追加唯一键。可以通过修改表字段属性,也可以直接追加

        -- 追加唯一键:通过修改表字段属性
        alter table 表名 modify 字段名 列类型 unique key;
    
        -- 追加唯一键:直接追加
        alter table 表名 add unique key(字段列表);
        -- 追加唯一键
        create table my_unique3(
            id int primary key auto_increment,
            number char(10) not null,
            name varchar(20) not null
        )charset utf8;
    
        -- 查看表结构
        desc my_unique3;
    
        -- 追加唯一键
        -- 方式一:通过修改表字段属性
        alter table my_unique3 modify number char(10) unique key not null;
        -- 方式二:直接追加
        alter table my_unique3 add unique key(number);
    
        -- 查看表结构
        desc my_unique3;

    3、查看唯一键

    (1)方式一:唯一键是属性,可以通过查看表结构来查看唯一键(UNI)

    (2)方式二:通过查看表创建语句来查看唯一键

    注:在查看表创建语句的时候,会看到唯一键与主键不同的一点,会多出一个xxx(unique key 'xxx' (字段名xxx) )。系统会为唯一键自动创建一个索引名,默认和字段名相同

    4、唯一键约束

    (1)唯一键与主键本质相同,唯一的区别就是唯一键默认允许字段为空,而且可以多个为空

    注:如果唯一键也不允许为空,那么唯一键与主键的约束作用就是一致的

    (2)唯一键在不为空的情况下,不允许重复(非空不允许重复)。为空null的数据可以放心插入,插多少个都没问题(null无法计算)

        -- 创建表
        create table my_unique4(
            number char(10) unique comment '学号:唯一,允许为空',
            name varchar(10) not null
        )charset utf8;
    
        -- 查看表结构
        desc my_unique4;
    
        -- 插入数据。唯一键可以有多个为空
        insert into my_unique4 values (null, 'zhangsan'), ('itcast0001', 'lisi'), (null, 'wangwu');
    
        -- 查看数据
        select * from my_unique4;
    
        -- 插入数据
        insert into my_unique4 values ('itcast0001', 'zhaoliu');    -- 报错,number需唯一

    5、更新唯一键&删除唯一键

    (1)更新唯一键:先删除,后新增(唯一键可以有多个,可以不删除)

    (2)删除唯一键

        -- 删除唯一键
        -- 唯一键是索引的一种,提升查询效率
        alter table 表名 drop unique key;    -- 错误:唯一键有多个
        alter table 表名 drop index 索引名字;    -- 唯一键默认使用字段名作为索引名字
    
        -- 查看表结构
        desc my_unique3;
    
        alter table my_unique3 drop index number;
    
        -- 查看表结构
        desc my_unique3;

    八、索引

    1、几乎所有的索引都是建立在字段之上

    2、索引:系统根据某种算法,将已有的数据(未来可能新增的数据)单独建立一个文件。该文件能够实现快速的匹配数据,并且能够快速的找到对应表中的记录

    3、索引的意义

    (1)提升查询数据的效率

    (2)约束数据的有效性(唯一性等)

    4、索引本身会产生索引文件(有时候可能比数据文件还大),会非常耗费磁盘空间

    5、如果某个字段需要作为查询的条件经常使用,那么可以使用索引(一定要想办法增加)。如果某个字段需要进行数据的有效性约束,也可以使用索引(主键、唯一键)

    注:

    (1)普通查询是全表查询,匹配成功了也会把后面的数据查完

    (2)使用索引查询是去索引文件中找该条记录在磁盘上的哪一行,直接去那一行找该条数据即可,其他数据不会被查询

    6、MySQL中提供了多种索引

    (1)主键索引:primary key

    (2)唯一索引:unique key

    (3)全文索引:fulltext index

    (4)普通索引:index

    7、全文索引:针对文章内部的关键字进行索引。全文索引最大的问题在于如何确定关键字

    注:英文很容易,因为英文单词与单词之间有空格。中文很难,因为没有空格,而且中文可以各种随意组合(分词:sphinx)

     

    展开全文
  • 唯一键unique key,用来保证对应的字段中的数据唯一的 主键也可以用来保证字段数据唯一性,但是一张表只有一个主键。 1、 唯一键在一张表中可以有多个。 2、 唯一键允许字段数据为NULL,NULL可以有多个(NULL不...

    唯一键(唯一键是索引一种

    唯一键:unique key,用来保证对应的字段中的数据唯一的

    主键也可以用来保证字段数据唯一性,但是一张表只有一个主键。

    1、 唯一键在一张表中可以有多个。

    2、 唯一键允许字段数据为NULL,NULL可以有多个(NULL不参与比较)

    创建唯一键

    创建唯一键与创建主键非常类似

    1、 直接在表字段之后增加唯一键标识符:unique[ key]

    2、 在所有的字段之后使用unique key(字段列表);

    3、 在创建完表之后也可以增加唯一键
    alter table 表名 add unique key(字段列表);

    这里只演示第2种

     

    查看唯一键

    唯一键是属性,可以通过查看表结构来实现

    desc 表名(上图中已查看)

    唯一键效果:在不为空的情况下,不允许重复

    在查看表创建语句的时候,会看到与主键不同的一点:多出一个“licenseId”

    为什么唯一键创立后会自动创建一个名字?其实是索引,后续文章会讲解索引

    删除唯一键

    一个表中允许存在多个唯一键:假设命令为主键一样:alter table 表名 drop unique key;//错误的

    Index关键字:索引,唯一键是索引一种(提升查询效率)

    删除的基本语法:alter table 表名 drop index 唯一键名字;

     

    修改唯一键:先删除后增加

     

    复合唯一键

    唯一键与主键一样可以使用多个字段来共同保证唯一性;

    一般主键都是单一字段(逻辑主键),而其他需要唯一性的内容都是由唯一键来处理。

    展开全文
  • 索引 --> 添加索引 --> 栏位名(添加你想设置唯一约束的列) --> 索引类型选择 Unique 转载于:https://www.cnblogs.com/javamilan/p/4232041.html
  • 关于唯一键(Unique)

    2010-04-26 16:27:00
    SQL> create table test_ranbo(id number... Table created SQL> alter table test_ranbo add constraint test_ranbo$uk unique (id); Table alteredSQL> insert into test_ranbo(id) values(null); 1 row inserted
  • MySQL 设置唯一键约束(unique

    千次阅读 2020-05-26 18:13:24
    前言: 最近在优化一个功能,这个功能就是将80000 条数据按照分页分段获取,首先获取的是前...后面在优化过程我想着不如给表设置一个唯一约束吧, 在Native Premiumn中设计一下表,点到索引里面,将我下面这些值设置
  • 主键用于唯一标识表中的每一条数据。 主键的特征: 不能重复, 不能为空。 示例 create table stu1( id int auto_increment primary key, <------#主键 name varchar(20) ); 注意点: auto_increment的...
  • 【MySQL】中主键(primary key)和唯一键(unique)区别

    万次阅读 多人点赞 2019-04-20 19:00:50
    保证唯一性 是否允许为空 一个表中可以有多少个 能否组合 primary key √ × ...
  • I've got an error on MySQL while trying to add a UNIQUE KEY. Here's what I'm trying to do. I've got a column called 'unique_id' which is VARCHAR(100). There are no indexes defined on the table. I'm ge...
  • 本文主要介绍Mysql几种键和索引:MySQL中有三种Key和一个Index: Primary Key(主键), Unique Key(唯一键),Foreign Key(外键)和 Index(索引)四者的区别如下:定义:主键(Primary Key):唯一标识一条记录,不能有重复,...
  • 2、唯一键允许字段数据为NULL,NULL可以有多个(NULL不参与比较)创建唯一键创建唯一键和创建主键非常类似1、直接在表字段之后增加唯一键标识符:unique[key]2、在所有的字段之后使用unique key(字段列表);...
  • 四、UNIQUE ---- 唯一约束唯一键可以是单个字段,也可以是多个字段的组合,设置唯一约束后,INSERT或UPDATE时如果表中唯一键字段中已存在该数据,则拒绝该行数据的INSERT或UPDATE。但是数据库中NULL并不等于NULL,...
  • UNIQUE KEY `udx_name` (`name`), KEY `idx_name` (`name`) ) ENGINE=InnoDB 死锁产生的原因是: S1对(2,2)记录加X锁, S2/S3需要唯一键冲突检测,需要加S锁,由于X锁的存在,S锁的获取被阻塞。 S1提交或者回滚,...
  • 如果不设置unique 会出现两条相同的记录 mysql> create table department1(id int,name varchar(16)); Query OK, 0 rows affected (0.01 sec) mysql> insert into department1 values(1 ,'mike'),...
  • 主键、自增、唯一键和三大范式 主键primary key, 加在建表语句中primary key(主键列表),主键对应的字段不允许重复 ...唯一键unique key,解决多个字段需要保证唯一性的问题 范式 第一范式:字段中的数据具有原...
  • mysql 唯一键

    2019-10-03 07:01:40
    唯一键特点: 1、唯一键在一张表中可以有多个。 2、唯一键允许字段数据为NULL,NULL可以有多个(NULL不参与比较) //一个表中允许存在多个唯一键,唯一键允许为空,在不为空的情况下,不允许重复 //设置一个字段为...

空空如也

空空如也

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

唯一键unique