我使用启用sql-mode NO_AUTO_VALUE_ON_ZERO的MySQl,这意味着在INS列的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'特定器应该在mapper类中生成以下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 compliter生成正确的SQL代码,因为我不想禁用NO_AUTO_VALUE_ON_ZERO?
答案 0 :(得分: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_ left未初始化,odb将生成以下查询:
INSERT INTO person (id, first_name, last_name) VALUES (NULL, "John", "Dohn");
这正是我所需要的。