我需要使用Node在MariaDB 10.3数据库中创建非临时表。因此,我需要一种生成可以保证唯一的表名的方法。
Node函数无法访问有关创建表或何时创建表的任何唯一功能的信息,因此无法通过时间戳或连接ID来构建名称。我只能使用当前数据库来验证名称的唯一性。
This question的PostgreSQL答案提示以下内容:
SET @name = GetBigRandomNumber();
WHILE TableExists(@name)
BEGIN
SET @name = GetBigRandomNumber();
END
我尝试使用@name = CONCAT(MD5(RAND()),MD5(RAND()))
生成MariaDB实现以生成随机的64个字符串,并使用(COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE @name) >0
来检查它是否是唯一名称:
SET @name = CONCAT(MD5(RAND()),MD5(RAND()));
WHILE ((COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE @name) >0) DO
SET @name = CONCAT(MD5(RAND()),MD5(RAND()));
END WHILE;
CREATE TABLE @name ( ... );
但是,当我尝试运行上述查询时,出现语法错误。我的SQL知识不是那么好,所以我对可能的问题不知所措。
此外,这种方法有效吗?随机生成的名称足够长,以致它几乎不可能与数据库中的任何当前表发生冲突,因此WHILE
循环很少需要运行,但是有某种内置函数可以自动执行递增表名或类似名称?
答案 0 :(得分:1)
SET @name := UUID();
如果其中的破折号引起了麻烦,那么
SET @name := REPLACE(UUID(), '-', '');
比RAND()
更安全(朝着唯一性发展)。并且,从理论上讲,无需验证其唯一性。毕竟,这就是UUID的目的。