Как изменить ограничение данных в DuckDB R

Я пытаюсь изменить ограничение Not Null на ограничение Null в duckdb (R api) и не могу заставить его придерживаться. Вот пример проблемы.

drv<- duckdb()
con<- dbConnect(drv)
dbExecute(con, "CREATE TABLE db(a varchar(1) NOT NULL, b varchar(1) NOT NULL)")

d<- data.table(a = 1:3, b=c("a", NA, "b"))

#test 'not null' constraint
dbWriteTable(con, name = "db", value = d, append = T)
Error: Constraint Error: NOT NULL constraint failed: db.b

Итак, здесь я пытаюсь изменить «db», чтобы позволить мне написать «d» со значением NA в столбце b.

> dbSendQuery(con, "ALTER TABLE db ALTER COLUMN b SET DEFAULT NULL")
<duckdb_result 46970 connection=b6ff0 statement='ALTER TABLE db ALTER COLUMN b SET DEFAULT NULL'>

> dbWriteTable(con, name = "db", value = d, append = T)
Error: Constraint Error: NOT NULL constraint failed: db.b

Похоже, что «dbSendQuery» для изменения таблицы сработало (по крайней мере, без ошибок), но ясно, что ограничение не было изменено. Любые идеи о том, как сделать так, чтобы ограничение изменялось?

Я не думаю, что DuckDB ALTER TABLE поддерживает NOT NULL. Обходной путь: 1. Создайте новую таблицу с ограничением NOT NULL, 2. Убедитесь, что первая таблица не содержит NULL в соответствующих столбцах, 3. Скопируйте данные из первой во вторую таблицу, а затем удалите первая таблица.

stevec 13.05.2023 06:28

@stevec не совсем ... это то, что alter table нужно снять ограничение not null, так что это просто немного другой синтаксис

r2evans 13.05.2023 20:15
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
2
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте DROP NOT NULL вместо SET NOT NULL.

d <- data.table(a = 1:3, b=c("a", NA, "b"))DBI::dbWriteTable(duck, name = "db", value = d, append = T)
duck <- DBI::dbConnect(duckdb::duckdb())
DBI::dbWriteTable(duck, name = "db", value = d, append = T)
# ERROR [2023-05-13 14:11:15] {"msg":"uncaught error","error":"rapi_execute: Failed to run query\nError: Constraint Error: NOT NULL constraint failed: db.b","where":["DBI::dbWriteTable(duck, name = \"","DBI::dbWriteTable(duck, name = \"",".local(conn, name, value, ...)"],"pid":"511449"}
# Error: rapi_execute: Failed to run query
# Error: Constraint Error: NOT NULL constraint failed: db.b

Зафиксированный:

DBI::dbExecute(duck, "ALTER TABLE db ALTER COLUMN b DROP NOT NULL")
# [1] 0
DBI::dbWriteTable(duck, name = "db", value = d, append = T)
DBI::dbGetQuery(duck, "select * from db")
#   a    b
# 1 1    a
# 2 2 <NA>
# 3 3    b

Другие вопросы по теме