Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成id号mysql_Mysql_Sql_Triggers - Fatal编程技术网

生成id号mysql

生成id号mysql,mysql,sql,triggers,Mysql,Sql,Triggers,我想为我的用户表生成一个id号。 id号是唯一的索引 这是我的扳机 USE `schema_epolling`; DELIMITER $$ CREATE DEFINER=`root`@`localhost` TRIGGER `tbl_user_BINS` BEFORE INSERT ON `tbl_user` FOR EACH ROW BEGIN SET NEW.id_number = CONCAT(DATE_FORMAT(NOW(),'%y'),LPAD((SELECT auto_incre

我想为我的用户表生成一个id号。 id号是唯一的索引

这是我的扳机

USE `schema_epolling`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` TRIGGER `tbl_user_BINS` BEFORE INSERT ON `tbl_user` 
FOR EACH ROW
BEGIN
SET NEW.id_number = CONCAT(DATE_FORMAT(NOW(),'%y'),LPAD((SELECT auto_increment FROM   
information_schema.tables WHERE table_schema = 'schema_epolling' AND table_name =
'tbl_user'),6,0));
END
如果我一个接一个地插入。。或者一次5行。 但是如果我插入大量行。。发生了一个错误

 id number
下面是我用于从另一个架构/表插入批量行的代码:

INSERT INTO schema_epolling.tbl_user (last_name, first_name)
SELECT last_name, first_name
FROM schema_nc.tbl_person
错误如下:

Error Code: 1062. Duplicate entry '14000004' for key 'id_number_UNIQUE'

Error Code: 1062. Duplicate entry '14000011' for key 'id_number_UNIQUE'

Error Code: 1062. Duplicate entry '14000018' for key 'id_number_UNIQUE'

Error Code: 1062. Duplicate entry '14000025' for key 'id_number_UNIQUE'

Error Code: 1062. Duplicate entry '14000032' for key 'id_number_UNIQUE'

如果我使用uuid()函数,它可以正常工作。但是我不希望uuid()太长。

您不希望以这种方式生成id值

在执行INSERT触发器之前,尚未生成当前INSERT的自动增量值

即使是,信息_模式也将包含任何线程生成的最大自动增量值,而不仅仅是执行触发器的线程。因此,您的竞争条件很容易与其他并发插入冲突,并获得错误的值

此外,在每次插入时查询信息和模式可能是性能的瓶颈

在这种情况下,要使用预先设置的两位数年号格式化自动增量值,您可以将表的自动增量值提高到
%y
000000,然后当我们到达2015年1月1日时,您可以更改表以再次提高它


您的评论如下:

我上面给出的答案适用于MySQL的自动增量工作原理。如果不依赖于自动增量,则可以通过其他方法生成值

  • 按照@Vatev的建议增加另一个一行表(尽管这会在该表上创建一个相对较长的锁,这可能是插入的瓶颈)
  • 基于像memcached这样的中央原子id生成器在应用程序中生成值。请参见此处的其他想法:
  • 使用UUID()。是的,对不起,它有32个字符长。不要截断它,否则将使用唯一性

但是,以您显示的方式将触发器与自动增量相结合是行不通的。

我想再加上我的两分钱来阐述我的观点。 最好不要通过手动拼凑来生成唯一的ID

事实上,你的学校以这种方式生成ID并不意味着这是最好的方法(假设他们正在使用生成的值,没有更多信息我无法知道)

如果您接受ID字段(或键)的目的是保证每行数据的唯一性,而不是将某些人类可读数据存储在中心位置的参考点,那么您的数据库工作将更简单,也不容易出错。 这种类型的ID/密钥称为代理密钥。 如果你想了解更多关于他们的信息,这里有一篇好文章: 代理键通常也是表的主键(以这种方式使用代理键可以极大地简化表之间的关系创建)

如果您想添加一个连接日期值和其他信息的辅助列,因为这对您正在编写的应用程序或任何其他适合的用途都很有价值,那么请在表中创建一个单独的列

在这种“fire&forget”方式中考虑ID列/键可以充分简化概念,使您在数据库创建工作中体验到许多好处。 例如,如果您需要联合国相关数据库之间的唯一性,您将更容易接受UUID的使用。 (因为你会知道它的目的只是为了确保独特性,而不是以任何其他方式对你有用。) 此外,正如您所发现的,由您自己承担责任,而不是依赖数据库来产生独特的价值,这会增加耗时的复杂性,否则是可以避免的


希望这有帮助

为什么不直接使用
自动增量
字段?没有理由重新发明轮子…我想要0成为那里的ID号码成为那里的默认用户名。我想生成类似于我的学生id号的内容。09001207.. 我认为格式为yy-000000,您的编号方案可能在y3k.1K年后出现问题?离现在太远了……)怎样?我在tbl_用户中有自动编号用户id。我不想等到2015年再改变它。是否有生成id号的解决方案?每年更改一次表是最好的解决方案(您可以为此创建一个事件)。在MySQL中有生成序列号的方法,但是这些方法比内置的自动增量慢得多。您可以检查是否生成序列号。嗯。。。我学校的程序员是怎么把我的身份证号码写成这样的。。09001027?... 我想知道:(09年是我注册的2009年。它的前序是..09001208..09001209这是可能的,最简单的方式(我知道)是使用一个有1个字段和1行的表来存储计数器,并手动递增。我编辑了我以前的注释,其中有一个指向该主题的另一个答案的链接。啊..所以在插入触发器之前,触发+1到该表计数器?这是什么意思?。。