Postgres外部数据包装器:插入MySQL表主键自增问题

0 投票
1 回答
1811 浏览
提问于 2025-04-17 21:55

我正在使用PostgreSQL的外部数据包装器Multicorn(它使用SQLAlchemy)来映射外部MySQL数据库中的表。到目前为止,一切似乎都正常,但有一个问题:如果我在外部MySQL表上运行插入查询而不指定主键ID,因为这个ID是自动递增的,外部数据包装器会尝试添加新记录,并从1开始递增,即使在远程MySQL表中已经存在这样的主键。这可以通过一个例子更好地解释:

MySQL表:

CREATE TABLE `test` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `value` VARCHAR(100) NULL DEFAULT NULL,
  PRIMARY KEY (`id`));

MySQL表数据:

select * from test;
+----+-------+
| id | value |
+----+-------+
|  1 | val1  |
|  2 | val2  |
|  3 | val3  |
+----+-------+

PostgreSQL FDW服务器:

CREATE SERVER test foreign data wrapper multicorn options (wrapper 'multicorn.sqlalchemyfdw.SqlAlchemyFdw');

PostgreSQL FDW表:

create foreign table test1 (
    id serial,
    value character varying
) server test options (
    tablename 'test',
    db_url 'mysql://root:root@127.0.0.1/test',
    primary_key 'id'
);

这是我尝试的插入语句:

insert into test1 (value) values ('val4');

它抛出了这个错误:

ERROR:  Error in python: IntegrityError
DETAIL:  (IntegrityError) (1062, "Duplicate entry '1' for key 'PRIMARY'") 'INSERT INTO test (id, value) VALUES (%s, %s)' (1L, u'val4')

出于某种原因,系统尝试手动插入一个我在两个数据库/表中都设置为自动递增的主键ID。为什么会这样?我该如何解决这个问题?是Postgres、FDW插件Multicorn还是SQLAlchemy导致的?

1 个回答

2

如果在PostgreSQL中使用int而不是serial会怎样呢?

create foreign table test1 (
    id int,
    value character varying
) server test options (
    tablename 'test',
    db_url 'mysql://root:root@127.0.0.1/test',
    primary_key 'id'
);

撰写回答