我使用启用了 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?