Lo que necesito es una migración para aplicar una restricción única a una combinación de columnas. es decir, para una tabla people
, una combinación de first_name
, last_Name
y Dob
debe ser única.Una migración para agregar una restricción única a una combinación de columnas
Respuesta
add_index :people, [:firstname, :lastname, :dob], :unique => true
Hola Puede añadir índice único en su migración a las columnas, por ejemplo
add_index(:accounts, [:branch_id, :party_id], :unique => true)
o índices únicos separados para cada columna
Lo sentimos, trabajó, primero juzgado por la edición y la migración existente, que no funcionaba, y luego añadió una nueva y funcionó, gracias. – rangalo
es posible que desee agregar una restricción sin una índice. Esto dependerá de la base de datos que estés usando. Debajo hay un código de migración de muestra para Postgres. (tracking_number, carrier)
es una lista de las columnas que desea usar para la restricción.
class AddUniqeConstraintToShipments < ActiveRecord::Migration
def up
execute <<-SQL
alter table shipments
add constraint shipment_tracking_number unique (tracking_number, carrier);
SQL
end
def down
execute <<-SQL
alter table shipments
drop constraint if exists shipment_tracking_number;
SQL
end
end
Existen diferentes restricciones que puede agregar. Read the docs
[Documentos para PostgreSQL 9.4] (http://www.postgresql.org/docs/9.4/static/ddl-constraints.html#DDL-CONSTRAINTS-UNIQUE-CONSTRAINTS) diga: _Añadir una restricción única creará automáticamente un btree único índice en la columna o grupo de columnas utilizadas en la restricción. Una restricción de exclusividad en solo algunas filas se puede aplicar mediante la creación de un índice parcial. Así que en mi humilde opinión no hay necesidad de pasar al SQL sin formato cuando el resultado será básicamente el mismo que usar el método 'add_index'. ;) –
En realidad, hay una razón: es un detalle de implementación y desaconseja [docs] (http://www.postgresql.org/docs/9.3/static/indexes-unique.html). También tenga en cuenta que no puede hacer referencia a la restricción por su nombre, ya que no se agrega a la tabla 'pg_constraint'. – kaikuchn
De acuerdo con howmanyofme.com, "Hay 46.427 personas llamadas John Smith" solo en los Estados Unidos. Eso es alrededor de 127 años de días. Como esto está muy por encima de la esperanza de vida promedio de un ser humano, esto significa que un choque entre DOB es matemáticamente seguro.
Todo lo que digo es que esa combinación particular de campos únicos podría llevar a una frustración extrema de usuario/cliente en el futuro.
Considere algo que es realmente único, como un número de identificación nacional, si corresponde.
(Me doy cuenta de que soy muy tarde a la fiesta con éste, pero podría ayudar a los lectores futuros.)
hrm ... ciertamente tienes razón. pero probablemente fue solo un ejemplo de lo que Ian quería hacer solo para aclarar la pregunta. – eritiro
Quizás. La respuesta no fue pensada para Ian, sin embargo. O de hecho Rangalo. –
En el ejemplo típico de una tabla de unión entre los usuarios y mensajes:
create_table :users
create_table :posts
create_table :ownerships do |t|
t.belongs_to :user, foreign_key: true, null: false
t.belongs_to :post, foreign_key: true, null: false
end
add_index :ownerships, [:user_id, :post_id], unique: true
Tratar de crear dos registros similares lanzará un error de base de datos (PostgreSQL en mi caso):
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_ownerships_on_user_id_and_post_id"
DETAIL: Key (user_id, post_id)=(1, 1) already exists.
: INSERT INTO "ownerships" ("user_id", "post_id") VALUES ($1, $2) RETURNING "id"
por ejemplo, haciendo que:
Ownership.create!(user_id: user_id, post_id: post_id)
Ownership.create!(user_id: user_id, post_id: post_id)
ejemplo totalmente ejecutable: https://gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced
db/schema.rb
generada: https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744a
- 1. Combinación de dos columnas restricción única
- 2. ¿Cómo se especifica que una combinación de columnas debe ser una restricción única utilizando anotaciones?
- 3. Restricción única sobre varias columnas
- 4. Agregue una restricción única en columnas múltiples con FluentNHibernate
- 5. Restricción única en varias columnas
- 6. sur: ejecuta una migración para una columna que es única y no nula
- 7. Cómo crear una restricción ÚNICA compuesta en FluentNHibernate?
- 8. Restricción única en una arquitectura RESTFul
- 9. Utilizando una restricción única en Hibernate JPA2
- 10. Griales clase de dominio: restricción única para múltiples columnas
- 11. Adición de varias columnas en una migración
- 12. SQL ¿Puedo tener una restricción "condicionalmente única" en una tabla?
- 13. Encontrar una restricción única de tabla de base de datos
- 14. ¿Cómo puedo agregar una identificación única a una celda personalizada?
- 15. Restricción de la tabla de SQLite: única en varias columnas
- 16. Combinación única de frecuencias
- 17. ¿Puedo agregar una restricción ÚNICA a una tabla de PostgreSQL, después de que ya se haya creado?
- 18. Cómo crear una restricción única compuesta en SQL Server 2005
- 19. ¿Cómo puedo crear una restricción única de SQL basada en 2 columnas?
- 20. ¿Cómo agrego una restricción de verificación en una migración de Rails?
- 21. Infracción de restricción única de Oracle que hace referencia a una restricción que no parece existir
- 22. Cómo crear un índice de múltiples columnas o una restricción única con NHibernate
- 23. restricción única condicional
- 24. Oracle - Agregar columnas a una tabla requiere para siempre
- 25. Agregar columna Id en una migración
- 26. SQL Server 2008: Las columnas de la tabla no coinciden con una clave principal existente o una restricción única
- 27. Postgres Restricción única en dos columnas: Entero y booleano
- 28. Agregar una columna a una tabla existente en una migración de Rails
- 29. Intercambio de valores con una restricción única en Entity Framework
- 30. ¿Cómo obtener el nombre de una restricción única en postgresql?
Creo que está agregando un índice único, * no * una restricción. ¿O el índice agrega la restricción también? –
No, todo está bien. ¡Mi error! La restricción única viene con el índice único. –
Estoy de acuerdo con @ paul-cantrell: ¿no hay alguna manera de agregar solo una restricción, no un índice (que tenga influencias de almacenamiento de db) –