MySQL实现自动使用uuid作为主键以及解决不能调用触发器的一点思路

这里使用触发程序实现此功能.

触发程序语法如下:

Create trigger <tri_name>

{before|after}

{insert|update|delete}

On <tab_name>

For each row

<触发程序SQL语句>

核心代码:

 1 use t14test
 2 show tables
 3 drop table if exists uuidTest
 4 create table uuidTest(
 5   testId VARCHAR(36) not NULL DEFAULT ‘1‘,
 6   testData VARCHAR(32),
 7   PRIMARY KEY(`testId`)
 8 )
 9 /*创建触发器*/
10 /*
11  * terminal创建存储过程需要定义分隔符
12  * delimiter //
13  * */
14 create trigger tri_auto_uuid
15 before insert
16 on uuidTest
17 for each ROW
18 BEGIN
19 if new.testId = ‘1‘ THEN set new.testId = (select uuid());
20 end if;
21 END
22 /*删除触发器*/
23 drop trigger if exists tri_auto_uuid
24 /*插入数据*/
25 insert into uuidTest(testData)VALUES(‘一条数据‘)
26 select * from uuidTest

运行了三次插入操作,结果如下:

使用触发器可实现uuid作为主键.

有问题的代码:

1 create trigger tri_auto_uuid
2 after insert
3 on uuidTest
4 for each ROW
5 update uuidTest set testId=((select uuid()))

如果这样定义触发程序,看似没问题,也能添加成功,但是录入数据会报错.

Can‘t update table ‘tb_user‘ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

网上说为了避免递归触发,update一条数据后不能触发对该数据进行除了Set之外的更新操作.否则就会报错.

可是我这个触发器是after insert 而且是Set 操作,为什么会有问题呢?

这里存在某种原因,可能和递归触发有关系.暂且不去管他底层是如何运作的.只需要改变一下思路,把after insert 改成 before insert 就行了.

时间: 2024-11-06 23:08:00

MySQL实现自动使用uuid作为主键以及解决不能调用触发器的一点思路的相关文章

为什么分布式数据库中不使用uuid作为主键?

分布式数据库当然也有主键的需求,但是为什么不直接使用uuid作为主键呢?作为曾经被这个问题困惑过的人,试着回答一下 1. UUID生成速率低下 Java的UUID依赖于SecureRandom.nextBytes方法,而SecureRandom又依赖于操作系统提供的随机数源, 在Linux系统下,它的默认依赖是/dev/random,而这个源是阻塞的. 最可怕的是,这个nextBytes方法还是一个synchronized方法,也就是说,如果多线程调用UUID,生成速率不升反降. 测试结果:在一

MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)

测试缘由 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿实际的案例来说服他,所以准备做一个详细的测试.   作为互联网公司,一定有用户表,而且用户表UC_USER基本会有百万记录,所以在这个表基础上准测试数据来进行测试.            测试过程是目前我想到的多方位的常用的几种类型的sql进行测试,当然可能不太完善,欢迎大家留言提出更加完善的测试方

【Python】Django Model 怎么使用 UUID 作为主键?

>>> import uuid print uuid.uuid3(uuid.uuid1(), 'python.org') >>> # make a UUID based on the host ID and current time >>> uuid.uuid1() UUID('a8098c1a-f86e-11da-bd1a-00112444be1e') >>> # make a UUID using an MD5 hash of a

MySQL的几个概念:主键,外键,索引,唯一索引

概念: 主键(primary key) 能够唯一标识表中某一行的属性或属性组.一个表只能有一个主键,但可以有多个候选索引.主键常常与外键构成参照完整性约束,防止出现数据不一致.主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引. 外键(foreign key) 是用于建立和加强两个表数据之间的链接的一列或多列.外键约束主要用来维护两个表之间数据的一致性.简言之,表的外键就是另一表的主键,外键将两表联系起来.一般情况下,要删除一张表中的主键必须首

MySQL数据库使某个不是主键的字段唯一

在使用MySQL数据的过程中有时候我们需要某个不是主键的字段不重复,这个时候就要用到SQL的UNIQUE约束了. 下面摘抄自w3school里的一段介绍: UNIQUE 约束唯一标识数据库表中的每条记录. UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证. PRIMARY KEY 拥有自动定义的 UNIQUE 约束. 请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束. 下面在 "Persons" 表创建时在

solr亿万级索引优化实践-自动生成UUID

solr亿万级索引优化实践(三) 原创 2017年03月14日 17:03:09 本篇文章主要介绍下如何从客户端solrJ以及服务端参数配置的角度来提升索引速度. solrJ6.0提供的Java客户端主要有下面几种接口:HttpSolrClient,ConcurrentUpdateSolrClient,CloudSolrClient.下面分别对这三种接口做一个简单的比较.HttpSolrClient在定义的时候需要明确指定一个solr节点路径,他在提交数据的时候也只能提交到这个节点上:Concu

mybatis新增对象自动生成uuid方案

mybatis新增对象时, 使用拦截器自动生成uuid方案有了它不再去xml中手动添加selectKey了, 生成id方案实现类自行实现, 实现IdGenerator接口便可, 主要代码由公司同事编写, 我进行改造 使用时可以在id字段上添加@Id注解, 也可以在getId方法上添加或者不添加, 但是主键名字必须是id, 类型必须是String @Target({ METHOD, FIELD }) @Retention(RUNTIME) public @interface Id { Class<

MySQL建表时不设置主键

在mysql的技术文档里面有如下文字: If you do not define a PRIMARY KEY for your table, MySQL picks the first UNIQUE index that has only NOT NULL columns as the primary key and InnoDB uses it as the clustered index. If there is no such index in the table, InnoDB inte

关于MySQL主从复制中UUID的警告信息

日期: 2014年5月23日 博客: 铁锚 最近在查看MariaDB主从复制服务器 Master 的错误日志时看到很多条警告信息,都是提示 UUID()函数不安全,可能 Slave 产生的值和 Master不一致, 警告信息大致如下: 140522 15:11:10 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Stateme