r - 添加关系(外键)失败

标签 r postgresql

我正在尝试添加两个表之间的关系(在模式 mittschema 中)。

以下 MWE 显示生成的错误。

library(data.table)
library(DBI)
con <- dbConnect(RPostgres::Postgres()
                                 , host='localhost'
                                 , port='5432'
                                 , dbname='postgres'
                                 , user="xx"
                                 , password="yy")
tbl01 <- data.table(basket=c(1L, 2L, 3L), fruit=c("Apple", "Orange", "Citrus"))
tbl02 <- data.table(basket=c(1L, 2L, 3L), color=c("Red", "Blue", "Yellow"))
RPostgres::dbWriteTable(con, name=DBI::Id(schema="mittschema", table="tbl01"), value=tbl01, overwrite = TRUE)
RPostgres::dbWriteTable(con, name=DBI::Id(schema="mittschema", table="tbl02"), value=tbl02, overwrite = TRUE)
RPostgres::dbGetQuery(con, "alter table mittschema.tbl01 add primary key (basket)")
RPostgres::dbGetQuery(con, "alter table mittschema.tbl02 add primary key (basket)")
# The following command fails
RPostgres::dbGetQuery(con, "ALTER TABLE mittschema.tbl02 ADD CONSTRAINT lnk_tbl_01_tbl_02 FOREIGN KEY ( Basket ) REFERENCES mittschema.tbl01 ( Basket );")
# Error in result_create(conn@ptr, statement) : 
#    Failed to fetch row: ERROR:  there is no unique constraint matching given keys for referenced table "tbl01"
dbDisconnect(con)

创建关系的命令应该怎么写?

编辑:出于某种原因,它现在可以工作了。

最佳答案

这些行只是为 tmp.sql 赋值。

tmp.sql <- "alter table mittschema.tbl01 add primary key (basket)"
tmp.sql <- "alter table mittschema.tbl02 add primary key (basket)"
tmp.sql <- "alter table mittschema.tbl01 add constraint unique (basket)"
tmp.sql <- "alter table mittschema.tbl02 add constraint unique (basket)"

您需要在添加外键之前执行这些 SQL 语句。

tmp.sql <- "alter table mittschema.tbl01 add primary key (basket)"
res <- RPostgres::dbSendQuery(con, tmp.sql)
tmp.sql <- "alter table mittschema.tbl02 add primary key (basket)"
res <- RPostgres::dbSendQuery(con, tmp.sql)
tmp.sql <- "alter table mittschema.tbl01 add constraint unique (basket)"
res <- RPostgres::dbSendQuery(con, tmp.sql)
tmp.sql <- "alter table mittschema.tbl02 add constraint unique (basket)"
res <- RPostgres::dbSendQuery(con, tmp.sql)

res <- RPostgres::dbSendQuery(con, "ALTER TABLE mittschema.tbl02 ADD CONSTRAINT lnk_tbl_01_tbl_02 FOREIGN KEY ( Basket ) REFERENCES mittschema.tbl01 ( Basket );")

关于r - 添加关系(外键)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54700567/

相关文章:

postgresql - 在 Rails 中对库存进行分组和计数

r - 停止ggplot2使其数据点超出轴限制?

r - 如何以 log2(n+1) 格式重新缩放 x 轴上的标签?

postgresql - 如何在 Freebsd 上从源代码安装 PGlogical?

postgresql - 在 plpgsql 中以编程方式访问记录的列

ruby-on-rails - Centos 5 上的 Postgresql 9.2、rails、bundle - PostgreSQL 太旧

macos - "brew install osm2pgsql"失败

r - 使用效果包循环 glmer 函数时出现意外错误

css - 使用 renderPlot() 删除 R Shiny ggplot 中 geom_sf() 对象周围的白边

r - ioslides 中标题和绘图之间的空白