elixir - migrations - Creando una restricción única en dos columnas juntas en Ecto
get_by elixir (3)
Puede crear un índice único en varias filas con
create unique_index(:some_table, [:col1, :col2])
Supongo que si desea tener claves compuestas, necesita usar execute/1
para ejecutar su SQL manualmente. Sin embargo, no estoy seguro de qué tan bien funcionan las teclas compuestas con Ecto, generalmente me quedo con la ID de serie estándar por tabla.
Si debería optar por el enfoque de clave compuesta, creo que las restricciones NOT NULL
no son necesarias. La clave compuesta ya debe hacer cumplir que las columnas no son nulas.
¿Cómo crear un índice único en dos columnas en Ecto, que correspondería a esto:
CREATE TABLE someTable (
col1 int NOT NULL,
col2 int NOT NULL,
primary key (col1, col2)
)
?
Un poco de seguimiento a la respuesta de Patrick.
Usar solo crear unique_index en su modelo finalmente lanzará una excepción en lugar de darle un error.
Para obtener un error, agregue una restricción en su conjunto de cambios, pero como parámetro puede dar el nombre del índice creado por unique_index.
Así que en su archivo de migración:
create unique_index(:your_table, [:col1, :col2], name: :your_index_name)
Luego en su conjunto de cambios:
def changeset(model, param // :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> unique_constraint(:name_your_constraint, name: :your_index_name)
end
unique_index
no crearía una clave primaria compuesta como se muestra en el ejemplo de la pregunta. Crea una restricción única.
Si desea crear una clave principal compuesta (nota: no se recomienda cuando se trabaja con Ecto), hay más información aquí :
Migración:
defmodule HelloPhoenix.Repo.Migrations.CreatePlayer do
use Ecto.Migration
def change do
create table(:players, primary_key: false) do
add :first_name, :string, primary_key: true
add :last_name, :string, primary_key: true
add :position, :string
add :number, :integer
...
Esquema:
defmodule HelloPhoenix.Player do
use Ecto.Schema
@primary_key false
schema "players" do
field :first_name, :string, primary_key: true
field :last_name, :string, primary_key: true
field :position, :string
field :number, :integer
...
unique_index
embargo, en la mayoría de los casos, unique_index
es lo que quieres.