Sql 生成具有唯一名称的表
我需要使用Node在MariaDB 10.3数据库中创建非临时表。因此,我需要一种生成保证唯一的表名的方法 节点函数无法访问有关创建表的内容或时间的任何唯一功能的信息,因此我无法根据时间戳或连接ID生成名称。我只能使用当前数据库验证名称的唯一性 有一个PostgreSQL的答案建议如下:Sql 生成具有唯一名称的表,sql,node.js,mariadb,Sql,Node.js,Mariadb,我需要使用Node在MariaDB 10.3数据库中创建非临时表。因此,我需要一种生成保证唯一的表名的方法 节点函数无法访问有关创建表的内容或时间的任何唯一功能的信息,因此我无法根据时间戳或连接ID生成名称。我只能使用当前数据库验证名称的唯一性 有一个PostgreSQL的答案建议如下: SET @name = GetBigRandomNumber(); WHILE TableExists(@name) BEGIN SET @name = GetBigRandomNumber(); E
SET @name = GetBigRandomNumber();
WHILE TableExists(@name)
BEGIN
SET @name = GetBigRandomNumber();
END
我尝试使用@name=CONCAT(MD5(RAND()),MD5(RAND())
生成一个随机的64字符字符串,并使用(COUNT(*)从INFORMATION_SCHEMA.TABLES(其中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
循环,但是是否有某种内置函数来自动递增表名或类似的内容
SET @name := UUID();
如果那条破折号引起麻烦,那么
SET @name := REPLACE(UUID(), '-', '');
它将比
RAND()
更安全(朝向唯一性)。而且,从理论上讲,无需验证其唯一性。毕竟,这就是UUID的目的。。对于应用程序使用的数据模型,生成随机表名的需要似乎是一个真正的问题。我怀疑你可能有更深层次的问题。@GordonLinoff很可能就是这样。该应用程序允许用户创建和协作项目。我将每个项目存储在一个单独的表中;因此,当用户创建新项目时,相应的表必须具有唯一的名称。(老实说,我可以将用户ID和时间戳组合成一个唯一的名称,但我想看看是否可以仅使用SQL实现这一点)。这可能是一个不好的模型使用-我没有太多的经验与数据库,所以以我有限的知识,这是什么有意义时,设计的概念。这些都应该是单个表中的行。如果您有安全要求——用户数据需要与其他用户物理隔离——那么您应该使用单独的数据库。@GordonLinoff谢谢,非常有用!我可以问一下:为什么把它们放在一张桌子上会更好?效率?性能、可维护性、安全性和分析效率都在我脑海中浮现。我最终按照@GordonLinoff的建议重新构建了数据模式,使用一个表,但这似乎是解决原始问题的一个非常优雅的解决方案。