我正在使用PostgreSQL外部数据包装器Multicorn(使用SQLAlchemy)来映射外部MySQL数据库中的表。到目前为止,一切似乎都运行良好,除了一个问题:如果我在外部mysql表上运行插入查询而没有指定主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?
答案 0 :(得分: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'
);