MariaDB 默认函数将自动增量的 PK 字段更改为 null
Posted
技术标签:
【中文标题】MariaDB 默认函数将自动增量的 PK 字段更改为 null【英文标题】:MariaDB default function changing PK field with auto increment to null 【发布时间】:2022-01-21 07:19:03 【问题描述】:以下面的查询为例,我将数据插入到teams表中,teamId(类型:INT)是主键,自增设置为true。
'INSERT INTO `teams` (`teamId`,`teamName`,`referralCommission`,`createdAt`,`updatedAt`,`companyId`) VALUES (DEFAULT,?,?,?,?,?);'
此查询在 mysql 上运行良好,但在 MariaDB 上,默认值被转换为 null,我知道这是未为列设置默认值时的正常行为。但在我的例子中,teamId 是自动递增的,所以默认值应该指向下一个可用的 id。相反,所有条目的 teamId 都设置为 0(从 null 转换),并且由于 teamId 是主键,我无法向表中添加新条目。
有什么方法可以在 mariadb 中使用 MySQL 的默认功能?或任何其他解决此问题的方法。
P.S 我知道我可以从查询中完全删除 teamId 字段,它会起作用,但我需要上述查询才能正常工作。
【问题讨论】:
如果您有一个自动增量列,您通常不需要在插入查询中为其添加值,即INSERT into teams (teamname, referralCommission, ..) values (?,?..)
请注意缺少的teamId
和DEFAULT
值。如果这不起作用,请分享您的表定义。
如果该列 真的 是自动增量列,即使您明确指定 NULL
作为值,它也会插入下一个 int
。即像insert into team(teamid, ...) values (NULL, ...)
这样的东西仍然会插入下一个数字而不是空
@derpirscher 是的,你提到的工作,删除 teamId 和 DEFAULT 工作正常。但我需要让查询按原样运行。我正在使用 Sequelize 通过 Express.JS 连接到 MariaDB。不幸的是,每当 Sequelize 运行 create 函数时,它都会发送主键设置为 DEFAULT 的查询。
DEFAULT
也可以正常工作。看到这个小提琴(dbfiddle.uk/…)因此我要求提供确切的表定义。因为如果你的查询不起作用,很可能是你的表定义有问题。
@derpirscher 我尝试在 sequelize create 函数中将 teamId 显式设置为 null 并且它有效!以前,我没有将 teamId 的值提供给 sequelize 函数,默认情况下,它会添加 DEFAULT。现在它正在工作。谢谢。
【参考方案1】:
我不能说你在做什么。您使用的是哪个 MariaDB 版本?
样本
MariaDB [bernd]> SELECT VERSION();
+----------------------------------------+
| VERSION() |
+----------------------------------------+
| 10.2.41-MariaDB-1:10.2.41+maria~bionic |
+----------------------------------------+
1 row in set (0.06 sec)
MariaDB [bernd]>
MariaDB [bernd]> TRUNCATE pk_default;
Query OK, 0 rows affected (0.09 sec)
MariaDB [bernd]> SELECT * FROM `pk_default`;
Empty set (0.01 sec)
MariaDB [bernd]> INSERT INTO `pk_default` (`id`, `sid`, `val`)
-> VALUES
-> (DEFAULT, 6, 45);
Query OK, 1 row affected (0.00 sec)
MariaDB [bernd]> SELECT * FROM `pk_default`;
+----+-----+------+
| id | sid | val |
+----+-----+------+
| 1 | 6 | 45 |
+----+-----+------+
1 row in set (0.00 sec)
MariaDB [bernd]> INSERT INTO `pk_default` (`id`, `sid`, `val`)
-> VALUES
-> (DEFAULT, 6, 45);
Query OK, 1 row affected (0.01 sec)
MariaDB [bernd]> SELECT * FROM `pk_default`;
+----+-----+------+
| id | sid | val |
+----+-----+------+
| 1 | 6 | 45 |
| 2 | 6 | 45 |
+----+-----+------+
2 rows in set (0.00 sec)
MariaDB [bernd]> INSERT INTO `pk_default` (`id`, `sid`, `val`)
-> VALUES
-> (DEFAULT, 6, 45);
Query OK, 1 row affected (0.00 sec)
MariaDB [bernd]> SELECT * FROM `pk_default`;
+----+-----+------+
| id | sid | val |
+----+-----+------+
| 1 | 6 | 45 |
| 2 | 6 | 45 |
| 3 | 6 | 45 |
+----+-----+------+
3 rows in set (0.01 sec)
MariaDB [bernd]>
【讨论】:
以上是关于MariaDB 默认函数将自动增量的 PK 字段更改为 null的主要内容,如果未能解决你的问题,请参考以下文章
kafka-connect sink 连接器 pk.mode 用于具有自动增量的表
将 MyISAM 转换为 InnoDB,其中表具有两列(复合)PK,其中之一是自动增量
Laravel 迁移 - 如何将 `id` 字段更改为主要字段并稍后自动递增