2

我创建一个 MySQL 表如下:

create table schema_name.test (
col1 varchar(10),
col2 varchar(10),
primary key (col1),
index col1_index (col1)
)

data.frame使用dbWriteTable将 a 写入表,如下所示:

> test <- data.frame(col1 = c("a","b"),col2 = c("apple","banana"))
> types <- c("varchar(10)","varchar(10)")
> names(types) <- names(test)
> dbWriteTable(conn = con, overwrite = TRUE, value = test, name = "test",field.types = types)

在执行此操作并检查 MySQL 环境中的表后,我看到主键和索引已被删除(con这是一个使用创建的连接对象dbConnect( odbc::odbc(),"my_dsn_name"))。这是不希望的。

我试图实现的行为是覆盖表中的数据,同时保持表的元数据/结构完好无损。

我知道我可以创建另一个具有相同结构的表,使用 将数据写入该表dbWriteTable,然后使用插入语句将数据从另一个表复制到目标表中,但这有点开销,感觉就像这应该是不必要的。顺序执行所有数据的删除和追加同样有问题。

这个问题有更优雅的解决方案吗?键和索引的破坏是预期的行为吗?文档非常稀少,似乎没有提供解决此问题的方法。

4

1 回答 1

1

首先,我想指出您当前的表定义有冗余:

CREATE TABLE schema_name.test (
    col1 VARCHAR(10),
    col2 VARCHAR(10),
    PRIMARY KEY (col1),
    INDEX col1_index (col1)
);

MySQL 会自动在主键上创建索引,所以你的索引定义是不必要的。

关于您实际的 R 问题,如果您不希望 R 覆盖表格,请尝试dbWriteTable使用overwrite=FALSE. 从这里探查,似乎dbWriteTablewithoverwrite=TRUE可能正在删除您的 MySQL 表,然后重新创建它。

根据您在下面的评论,如果您想删除表中的所有数据然后插入新数据,您可以先截断表,然后拨打电话dbWriteTable

dbGetQuery(con, "TRUNCATE TABLE schema_name.test")
dbWriteTable(conn=con, overwrite=FALSE, append=TRUE, value=test, name="test", field.types=types)
于 2019-05-14T14:47:53.457 回答