【问题标题】:How to set the column default value to generate random 6 digit number如何设置列默认值以生成随机 6 位数字
【发布时间】:2021-04-15 00:30:20
【问题描述】:

当向表中添加新行时,我想为一列生成 6 位随机数。我尝试了以下查询将默认值设置为该列

ALTER TABLE test_table 
    ADD COLUMN test_column int(10) NOT NULL DEFAULT LPAD(FLOOR(RAND() * 999999.99), 6, 1);

它不适用于 MySQL 5.6 并返回以下错误

错误 1064 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 'LPAD(FLOOR(RAND() * 999999.99), 6, 1)' 附近使用的正确语法

【问题讨论】:

  • 那么,您的主数据库是哪一个?为什么?
  • MYSQL 是我的主要数据库。我们在 prod 中使用 MYSQL,但对于开发工作,我们使用 MariaDB
  • “不工作”是什么意思?抛出了什么错误?你试过别的吗?您是否希望在两个不同的 DBMS 之间使用相同的语法?
  • 在我看来,为 dev 和 prod 选择两个不同的数据库从来都不是一个好的选择。当然,MariaDB 是 MySQL 的一个分支,但它们可以执行的操作仍然存在差异......这就是其中之一。我已经测试了 MySQL 5.6、5.7 和 8.0 版本,它们都未能运行您的语法;都返回相同的error 1064

标签: mysql sql mariadb lpad


【解决方案1】:

在 8.0.13 版本之前,MySQL 不支持将表达式作为列 DEFAULT。见https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html

mysql> create table mytable ( n varchar(6) default (lpad(rand() * 1000000, 6, '0')));

mysql> insert into mytable () values ();
Query OK, 1 row affected (0.00 sec)

mysql> select * from mytable;
+--------+
| n      |
+--------+
| 573663 |
+--------+

MariaDB 在 10.2.1 版本中支持类似的表达式默认值。见https://mariadb.com/kb/en/create-table/#default-column-option

应该在两个数据库的早期版本中工作的替代方法是定义一个触发器,如果​​列的值为 NULL,则默认设置随机值。

mysql> create table mytable ( n varchar(6) );

mysql> create trigger rand_lpad_ins before insert on mytable 
       for each row set NEW.n = COALESCE(NEW.n, lpad(rand() * 1000000, 6, '0'));

mysql> insert into mytable () values ();

mysql> select * from mytable;
+--------+
| n      |
+--------+
| 422870 |
+--------+

P.S.:在开发和生产中使用不同的数据库产品是个坏主意。在开发过程中,您可能会在 MariaDB 中使用与 MySQL 不同的功能。在部署到生产环境之前,您无法测试它们。这是一种代价高昂的惊喜,因为当你发现它时,你可能不得不重新修改你在开发中所做的很多工作。 MariaDB 和 MySQL 从 2010 年开始使用通用代码,但从那时起它们就开始出现分歧。您应该使用将在生产中使用的相同品牌和版本的数据库(以及任何其他软件)。

【讨论】:

  • 除非我误解了您的回答,否则 MariaDB 确实支持默认值中的表达式:The DEFAULT clause was enhanced in MariaDB 10.2.1. Some enhancements include: The DEFAULT clause can now be used with an expression or function.。您用于 MySQL 8.0 的相同 SQL 似乎至少适用于 MariaDB 10.3。
  • @markusjm,你是对的,我的错。我在上面编辑了我的答案,使其更准确。这支持了我关于在开发和生产中使用相同版本的后记,因为如果团队在开发中使用 MariaDB 10.2 或更高版本,他们可能会尝试使用表达式默认值,这在他们部署到 MySQL 5.6 上的生产时将不起作用。跨度>
  • 当然,使用您在生产中使用的相同版本进行开发至关重要,因为即使补丁版本不同也可能由于错误和改进而导致截然不同的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多