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 (?,?..) 请注意缺少的teamIdDEFAULT 值。如果这不起作用,请分享您的表定义。 如果该列 真的 是自动增量列,即使您明确指定 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 用于具有自动增量的表

markdown 将自动增量添加到现有PK

将 MyISAM 转换为 InnoDB,其中表具有两列(复合)PK,其中之一是自动增量

Laravel 迁移 - 如何将 `id` 字段更改为主要字段并稍后自动递增

将 _id 从 ObjectId 更改为正常的唯一自动增量整数

插入自定义自动增量字段