Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 星外通信中的复合主键_Elixir_Ecto - Fatal编程技术网

Elixir 星外通信中的复合主键

Elixir 星外通信中的复合主键,elixir,ecto,Elixir,Ecto,在迁移过程中,我们可以添加多个主键,它们都充当复合主键。我在表中有四个字段,其中三个是主键,工作得很好。当我尝试添加新迁移并将第四列作为主键时。博士后给了我这个错误 (Postgrex.Error) ERROR 42P16 (invalid_table_definition) multiple primary keys for table "rooms_units" are not allowed 这是我的新迁移: alter table(:rooms_units) do modif

在迁移过程中,我们可以添加多个主键,它们都充当复合主键。我在表中有四个字段,其中三个是主键,工作得很好。当我尝试添加新迁移并将第四列作为主键时。博士后给了我这个错误

   (Postgrex.Error) ERROR 42P16 (invalid_table_definition) multiple primary keys for table "rooms_units" are not allowed
这是我的新迁移:

alter table(:rooms_units) do
  modify(:date_to, :utc_datetime, primary_key: true)  
end 
  create table(:rooms_units, primary_key: false) do
   add(:room_id, references(:rooms), null: false, primary_key: true)
   add(:unit_id, references(:units), null: false, primary_key: true)
   add(:date_from, :utc_datetime, null: false, primary_key: true)
   add(:date_to, :utc_datetime, null: false, default: fragment("'infinity'::timestamp"))
  end
如果我在原始迁移中添加此项,则效果良好

这是我最初的迁移:

alter table(:rooms_units) do
  modify(:date_to, :utc_datetime, primary_key: true)  
end 
  create table(:rooms_units, primary_key: false) do
   add(:room_id, references(:rooms), null: false, primary_key: true)
   add(:unit_id, references(:units), null: false, primary_key: true)
   add(:date_from, :utc_datetime, null: false, primary_key: true)
   add(:date_to, :utc_datetime, null: false, default: fragment("'infinity'::timestamp"))
  end
如果我在date_to列中添加了主键:true,这就可以了。迁移成功运行

所以我想语法是正确的。但在新的迁移中它不会起作用

有什么建议或解决办法吗? 谢谢。

您有一个主键,它恰好是一个复合键

dbname=# \d+ rooms_units
   ...

Indexes:
"rooms_units_pkey" PRIMARY KEY, btree (room_id, unit_id, date_from)

   ...
无法添加其他主键。每个表只能有一个主键,即pk的定义。但是您可以删除当前主键并创建一个新的主键。也许有更优雅的方法可以在外太空做到这一点,但这是可行的

defmodule MyApp.Repo.Migrations.AlterRoomsUnits do
  use Ecto.Migration

  def change do
    drop(constraint("rooms_units", "rooms_units_pkey"))

    alter table(:rooms_units) do
      modify(:room_id, :integer, primary_key: true)
      modify(:unit_id, :integer, primary_key: true)
      modify(:date_from, :utc_datetime, primary_key: true)
      modify(:date_to, :utc_datetime, primary_key: true)
    end
  end
end
现在我们有了一个新的复合主键

dbname=# \d+ rooms_units
   ...

Indexes:
"rooms_units_pkey" PRIMARY KEY, btree (room_id, unit_id, date_from, date_to)

   ...
您有一个主键,它恰好是一个复合键

dbname=# \d+ rooms_units
   ...

Indexes:
"rooms_units_pkey" PRIMARY KEY, btree (room_id, unit_id, date_from)

   ...
无法添加其他主键。每个表只能有一个主键,即pk的定义。但是您可以删除当前主键并创建一个新的主键。也许有更优雅的方法可以在外太空做到这一点,但这是可行的

defmodule MyApp.Repo.Migrations.AlterRoomsUnits do
  use Ecto.Migration

  def change do
    drop(constraint("rooms_units", "rooms_units_pkey"))

    alter table(:rooms_units) do
      modify(:room_id, :integer, primary_key: true)
      modify(:unit_id, :integer, primary_key: true)
      modify(:date_from, :utc_datetime, primary_key: true)
      modify(:date_to, :utc_datetime, primary_key: true)
    end
  end
end
现在我们有了一个新的复合主键

dbname=# \d+ rooms_units
   ...

Indexes:
"rooms_units_pkey" PRIMARY KEY, btree (room_id, unit_id, date_from, date_to)

   ...

@脚本,然后您可以接受它作为正确的解决方案@脚本,然后您可以接受它作为正确的解决方案;