postgresql - Elixir -- Ecto -- 复合主键和关系
问题描述
有没有人成功地创建了与具有复合主键的表的关系?我正在努力实现以下目标:
create table(:resources, primary_key: false) do
add :id, :uuid, primary_key: true
add :version, :id, primary_key: true
# ... other details about the resource
end
create table (:resource_instances, primary_key: false) do
add :id, :uuid, primary_key: true
add :resource_id,
references(:resources, type: :uuid, column: :id),
null: false
add :resource_version,
references(:resources, type: :id, column: :version),
null: false
# ... specific details about this instance of the resource
end
运行迁移会生成以下日志:
11:24:00.100 [info] create table my_schema.resources
11:24:00.152 [info] create table my_schema.resource_instances
** (Postgrex.Error) ERROR 42830 (invalid_foreign_key) there is no unique constraint matching given keys for referenced table "resources"
(ecto_sql) lib/ecto/adapters/sql.ex:629: Ecto.Adapters.SQL.raise_sql_call_error/1
(elixir) lib/enum.ex:1336: Enum."-map/2-lists^map/1-0-"/2
(ecto_sql) lib/ecto/adapters/sql.ex:716: Ecto.Adapters.SQL.execute_ddl/4
(ecto_sql) lib/ecto/migration/runner.ex:343: Ecto.Migration.Runner.log_and_execute_ddl/3
(ecto_sql) lib/ecto/migration/runner.ex:117: anonymous fn/6 in Ecto.Migration.Runner.flush/0
(elixir) lib/enum.ex:1948: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto_sql) lib/ecto/migration/runner.ex:116: Ecto.Migration.Runner.flush/0
(stdlib) timer.erl:166: :timer.tc/1
(ecto_sql) lib/ecto/migration/runner.ex:25: Ecto.Migration.Runner.run/7
(ecto_sql) lib/ecto/migrator.ex:342: Ecto.Migrator.attempt/7
(ecto_sql) lib/ecto/migrator.ex:243: anonymous fn/4 in Ecto.Migrator.do_up/4
(ecto_sql) lib/ecto/migrator.ex:324: anonymous fn/3 in Ecto.Migrator.run_maybe_in_transaction/6
(ecto_sql) lib/ecto/adapters/sql.ex:898: anonymous fn/3 in Ecto.Adapters.SQL.checkout_or_transaction/4
(db_connection) lib/db_connection.ex:1415: DBConnection.run_transaction/4
(ecto_sql) lib/ecto/migrator.ex:323: Ecto.Migrator.run_maybe_in_transaction/6
(elixir) lib/task/supervised.ex:90: Task.Supervised.invoke_mfa/2
(elixir) lib/task/supervised.ex:35: Task.Supervised.reply/5
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
解决方案
尝试这个:
create table(:resources, primary_key: false) do
add :id, :uuid, primary_key: true
add :version, :id, primary_key: true, auto_generate: true
end
create unique_index(:resources, [:id])
create unique_index(:resources, [:version])
create table(:resource_instances, primary_key: false) do
add :resource_id,
references(:resources, type: :uuid, column: :id),
null: false
add :resource_version,
references(:resources, type: :id, column: :version),
null: false
end
似乎因为您正在创建一个复合键,您还需要创建单独的唯一索引才能引用这些索引,所以基本上为各个列添加了 unique_indices
推荐阅读
- java - 为什么 mockito 认为我的服务被调用了两次?
- python - 在 pandas 中打印时删除索引、名称、d_type 和“”
- javascript - 从 HTML 表单输入中解析 docx
- visual-studio-code - 如何重置被 vi 破坏的 VS Code 终端?
- android - ViewHolder 中 ImageView 的位置使用 .getLeft() 返回 0。如何在 ViewHolder 中获取 ImageView 的位置
- excel-formula - PowerBI - 用本周计算上周数据
- python - Python based on .txt file
- java - 在 Postman 中工作的 HTTP 查询在 Spring Boot Apache Camel 3.1 中不起作用
- python - 如何让我的代码使用定义的函数验证文件中的每一行
- javascript - 如何将我的 react js 类组件转换为功能组件?