dbWriteTable удаляет первичные ключи и индексы в MySQL - PullRequest
0 голосов
/ 14 мая 2019

Я создаю таблицу MySQL следующим образом:

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

и записываю data.frame в таблицу, используя dbWriteTable следующим образом:

> 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, а затем использовать оператор вставки, чтобы скопировать данные из этой другой таблицы в целевую таблицу, но это немного накладные расходыи чувствует, что это должно быть ненужным.Последовательное удаление и добавление всех данных аналогично проблематично.

Существует ли более элегантное решение этой проблемы, и подразумевается ли уничтожение ключей и индексов предполагаемым поведением?Документация довольно скудная и, похоже, не предлагает решения этой проблемы.

1 Ответ

0 голосов
/ 14 мая 2019

Во-первых, я хотел бы отметить, что у вашего текущего определения таблицы есть избыточность:

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

MySQL автоматически создаст индекс для первичного ключа, поэтому ваше определение индекса не требуется.

Что касается вашей реальной проблемы с R, если вы не хотите, чтобы R перезаписывал таблицу, попробуйте вызвать dbWriteTable с overwrite=FALSE.Из всего этого здесь кажется, что dbWriteTable с overwrite=TRUE может отбросить вашу таблицу MySQL и затем воссоздать ее.

Если вы хотите удалить все из приведенных ниже комментариев,данные в таблице, а затем вставьте новые данные, вы можете сначала обрезать таблицу, а затем сделать вызов dbWriteTable:

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