-1

当向表中添加新行时,我想为一列生成 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)' 附近使用正确的语法

4

1 回答 1

3

DEFAULTMySQL直到 8.0.13 版本才支持将表达式作为列。见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 |
+--------+

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

于 2021-04-15T01:04:30.530 回答