dbWriteTable删除MySQL中的主键和索引

时间:2019-05-14 14:36:11

标签: mysql r odbc primary-key table-index

我创建一个MySQL表,如下所示:

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

然后我使用dbWriteTabledata.frame写到表中,如下所示:

> 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")创建的连接对象)。这是不希望的。

我要实现的行为是覆盖表中的 data ,同时保持表的元数据/结构不变。

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

是否有解决此问题的更优雅的方法,销毁键和索引是否是预期的行为?该文档非常稀疏,似乎没有提供解决此问题的方法。

1 个答案:

答案 0 :(得分:0)

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

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

MySQL会在主键上自动创建一个索引,因此不需要定义索引。

关于您的实际R问题,如果您不希望R覆盖表,请尝试使用dbWriteTable调用overwrite=FALSE。从戳here到现在,似乎dbWriteTableoverwrite=TRUE可能会删除您的MySQL表,然后重新创建它。

根据下面的评论,如果要删除表中的所有数据然后插入新数据,则可以先截断表,然后调用dbWriteTable

dbGetQuery(con, "TRUNCATE TABLE schema_name.test")
dbWriteTable(conn=con, overwrite=FALSE, append=TRUE, value=test, name="test", field.types=types)