0

我使用启用了 sql 模式 NO_AUTO_VALUE_ON_ZERO 的 MySQl,这意味着不能在 PK 列的 INSERT 语句中使用 0 来指示 MySQL 它应该自动为 PK 分配值。

我有以下定义的持久对象:

#pragma db object
struct person
{
    #pragma db id auto
    uint64_t id_ = 0;

    std::string first_name_;
    std::string last_name_;
};

和表:

CREATE TABLE `person` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(50) NOT NULL,
`last_name` VARCHAR(50) NOT NULL,
 PRIMARY KEY(id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 collate=utf8_unicode_ci;

我假设'id auto'规范应该在映射器类中生成以下sql:

INSERT INTO person (first_name, last_name) VALUES ("John", "Dohn");

但真正的sql是:

INSERT INTO person (id, first_name, last_name) VALUES (0, "John", "Dohn");

这会导致插入 PK 值为零的行并导致重复的 PK 错误,而不是插入具有自动递增 id 的行。

是否有某种方法可以强制 odb 编译器生成正确的 SQL 代码,因为我不想禁用 NO_AUTO_VALUE_ON_ZERO?

4

1 回答 1

0

我发现实现正确行为的唯一可能方法是使用 odb::nullable:

#pragma db object
struct person
{
    #pragma db id auto
    odb::nullable<uint64_t> id_;

    std::string first_name_;
    std::string last_name_;
};

使用这种方法,如果 id_ 未初始化,odb 将生成以下查询:

INSERT INTO person (id, first_name, last_name) VALUES (NULL, "John", "Dohn");

这正是我需要的。

于 2017-03-23T15:00:44.220 回答