我正在try 将duckdb(R API)中的非Null约束更改为Null约束,但无法使其保持不变.以下是这个问题的一个例子.

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

因此,在这里我try 更改‘db’,以允许我在b列中使用其nA值写入‘d’

> 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’似乎起作用了(至少没有错误),但很明显约束没有更改.有没有什么办法让这一约束变化成为现实?

推荐答案

使用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

Sql相关问答推荐

查询将查找将标记设置为user2的用户

表名数组

将SEMI JOIN、ANTI JOIN转换为非连接SQL

在SQL中将相同且紧挨着的元素进行分组

当一个视图在Postgres中失效时?

关于Postgres横向联接的谓词

Oracle PL/SQL:解决DBMS输出大小限制的问题

合并分层表SQL中的第一个非空、变化的空位置

用于SQL协助的XQUERY()

通过UPDATE SELECT更新表时出现问题

将SQL Server查询改进为;线程安全;

根据要过滤的列的值进行联接和分组

SQL:考虑合并分支计算分支的增长百分比

有没有办法在雅典娜中将字符串转换为 int ?

PostgreSQL分割字符串为子词并判断其是否存在于其他字符串中

基于 Snowflake 的最大值创建新列

根据行号将列转置为没有任何id或键列的行

根据潜在空值的条件对记录进行计数

如何将 CONCATENATED 值与临时表中的值匹配

使用 json_agg 从 SQL 查询获取 [null] 响应