Я пытаюсь изменить ограничение 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» для изменения таблицы сработало (по крайней мере, без ошибок), но ясно, что ограничение не было изменено. Любые идеи о том, как сделать так, чтобы ограничение изменялось?
@stevec не совсем ... это то, что alter table нужно снять ограничение not null, так что это просто немного другой синтаксис


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