zoukankan      html  css  js  c++  java
  • MySQL中如何将主键默认值设为UUID()

    1、问题

    mysql中在设置主键(id)的默认值时,有一下两种情况:

    • 当 id 为 int 类型时,可以直接在创建表时设置id为 id primary key auto_increase,即默认 id 为主键自增长。
    • 当 id 为 varchar 类型时,要设置主键 id 默认值为唯一且不同字符串,这时需要使用UUID()函数,但是mysql中不支持默认值为函数,本文就是为了解决这个问题。

    2、解决方案

    首先,需要先创建一个表,SQL语句如下:

    CREATE TABLE traveller(
     id VARCHAR(50) PRIMARY KEY,-- 要设置默认值为UUID()的主键
     NAME VARCHAR(32),
     sex VARCHAR(20),
     phoneNum VARCHAR(20),
     credentialsType INT,
     credentialsNum VARCHAR(50),
     travellerType INT
    );
    

    在创建完表之后,需要创建一个触发器,从而将主键的默认值设定为UUID()生成的字符串。
    触发器的创建
    在创建好的触发器中编写的代码如下:

    DELIMITER $$
    CREATE
        /*[DEFINER = { user | CURRENT_USER }]*/
        TRIGGER `ssm`.`id_trigger` -- 触发器名称
        BEFORE INSERT             -- 触发器被触发的时机
        ON `ssm`.`traveller`       -- 触发器所作用的表名称
        FOR EACH ROW BEGIN
    		SET new.id=REPLACE(UUID(),'-',''); -- 触发器执行的逻辑
        END$$
    
    DELIMITER ;
    

    对于触发器的编写做以下总结:

    • create trigger ssm.id_triggerssm.id_trigger为触发器名称,可任意指定。
    • 触发器被触发的时机:在使用 insert/delete/update 这三种SQL语句对于指定表进行操作之前或之后(before/after)。

    在于语句中的表现: BEFORE INSERT ON ssm.traveller 即是在对ssm.traveller表进行 insert 操作之前 触发器被触发。

    • 触发器的执行逻辑:在 begin 和 end 之间的SET new.id = replace(UUID(),’-’,’’); ,即指定新的id值为: UUID()函数生成的字符串中的 ‘-’ 被替换为 ‘’ 之后的字符串。

    在触发器设定好之后,对于traveller表执行以下语句:

    INSERT INTO 
    traveller(NAME,sex,phoneNum,credentialsType,credentialsNum,travellerType) 
    VALUES('jay','男','13222222222',0,'1234567890026',0);
    

    所得到的的结果为:
    所得结果

    若触发器中所写逻辑为:

    SET new.id=UUID(); 
    

    插入后的结果应为:
    原始结果
    从以上对比中,可以知道这两种不同逻辑的区别。

    3、总结

    最后要知道该问题解决后所带来的优点和缺点:

    • 优点:使用UUID()函数生成的唯一标识来作为默认id值,使得用户的 id 更加安全。
    • 缺点:UUID()函数所生成的唯一标识过长,在高并发情况下影响效率,一般在该场景下不推荐使用。
  • 相关阅读:
    VS2013编写的C#程序,在xp下会报错说“不是合法的win32程序”。
    能根据串口驱动来 确定com号
    javaweb工程,Servlet里面获取当前WEB跟路径的文件绝对路径地址
    import了sun开头的类,虽然它在代码里压根就没派上用处!但是必须得引用!
    页面关闭时触发的时间
    jquery设置元素的readonly和disabled
    ibatis CDATA
    form的submit与onsubmit的用法与区别
    C#操作AD及Exchange Server总结(一)
    AD如何用C#进行增删改、查询用户与OU
  • 原文地址:https://www.cnblogs.com/zjL1997/p/12537169.html
Copyright © 2011-2022 走看看