Điều tôi cần là di chuyển để áp dụng ràng buộc duy nhất cho kết hợp các cột. tức là đối với bảng people
, sự kết hợp của first_name
, last_Name
và Dob
phải là duy nhất.Việc di chuyển để thêm ràng buộc duy nhất vào kết hợp các cột
Trả lời
add_index :people, [:firstname, :lastname, :dob], :unique => true
Hi Bạn có thể thêm chỉ số duy nhất trong di chuyển sang các cột ví dụ
add_index(:accounts, [:branch_id, :party_id], :unique => true)
hoặc chỉ số độc đáo riêng biệt cho mỗi cột
Xin lỗi, nó làm việc, đầu tiên tôi đã cố gắng bằng cách chỉnh sửa và di cư đang tồn tại mà không làm việc, sau đó thêm một cái mới và nó hoạt động, cảm ơn. – rangalo
Bạn có thể muốn thêm một hạn chế mà không có một mục lục. Điều này sẽ phụ thuộc vào cơ sở dữ liệu bạn đang sử dụng. Dưới đây là mã di chuyển mẫu cho Postgres. (tracking_number, carrier)
là danh sách các cột bạn muốn sử dụng cho ràng buộc.
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
Có những hạn chế khác nhau mà bạn có thể thêm. Read the docs
[Tài liệu cho PostgreSQL 9.4] (http://www.postgresql.org/docs/9.4/static/ddl-constraints.html#DDL-CONSTRAINTS-UNIQUE-CONSTRAINTS) nói: _Thêm ràng buộc duy nhất sẽ tự động tạo một btree duy nhất chỉ mục trên cột hoặc nhóm cột được sử dụng trong ràng buộc. Một ràng buộc duy nhất về chỉ một số hàng có thể được thực thi bằng cách tạo một chỉ mục một phần._ Vì vậy IMHO không cần phải thả xuống SQL thô khi kết quả về cơ bản giống như sử dụng phương thức 'add_index'. ;) –
Thực tế có một lý do: Đó là một chi tiết triển khai và không khuyến khích bởi [docs] (http://www.postgresql.org/docs/9.3/static/indexes-unique.html). Cũng lưu ý rằng bạn không thể tham chiếu đến ràng buộc theo tên, vì nó không được thêm vào bảng 'pg_constraint'. – kaikuchn
Theo howmanyofme.com, "Có 46.427 người có tên là John Smith" chỉ riêng ở Hoa Kỳ. Đó là khoảng 127 năm ngày. Vì điều này là tốt hơn tuổi thọ trung bình của một con người, điều này có nghĩa là một cuộc xung đột DOB là toán học nhất định.
Tất cả những gì tôi nói là sự kết hợp đặc biệt của các trường duy nhất có thể dẫn đến sự thất vọng cực kỳ của người dùng/khách hàng trong tương lai.
Hãy xem xét điều gì đó thực sự độc đáo, như số nhận dạng quốc gia, nếu thích hợp.
(Tôi nhận ra tôi rất muộn để đảng với thế này, nhưng nó có thể giúp người đọc trong tương lai.)
hrm ... bạn chắc chắn đúng. nhưng có lẽ nó chỉ là một ví dụ về những gì Ian muốn làm chỉ để làm cho câu hỏi rõ ràng. – eritiro
Có thể. Câu trả lời không dành cho Ian. Hay đúng là Rangalo. –
Trong ví dụ điển hình của một bảng tham gia giữa người sử dụng và các bài viết:
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
Cố gắng tạo hai bản ghi tương tự sẽ ném một lỗi cơ sở dữ liệu (Postgres trong trường hợp của tôi):
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"
ví dụ làm điều đó:
Ownership.create!(user_id: user_id, post_id: post_id)
Ownership.create!(user_id: user_id, post_id: post_id)
Hoàn toàn Runnable dụ: https://gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced
db/schema.rb
tạo: https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744a
- 1. Ràng buộc duy nhất qua nhiều cột
- 2. JPA - xác định các ràng buộc duy nhất nhiều cột
- 3. Ràng buộc duy nhất trên nhiều cột
- 4. SQL Server 2005 Ràng buộc duy nhất trên hai cột
- 5. Alembic: Cách thêm ràng buộc duy nhất vào cột hiện tại
- 6. Ràng buộc bảng SQLite - duy nhất trên nhiều cột
- 7. Các ràng buộc duy nhất trong couchdb
- 8. Làm thế nào để đưa ra một ràng buộc duy nhất đối với sự kết hợp các cột trong Oracle?
- 9. sqlalchemy Di chuyển các cột kết hợp để kết thúc
- 10. Buộc ràng buộc duy nhất trong GAE
- 11. Tìm xem cột có ràng buộc duy nhất
- 12. ràng buộc duy nhất có điều kiện
- 13. Giảm ràng buộc duy nhất cho cột trong H2
- 14. Laravel 4: kết hợp các giá trị/cột duy nhất
- 15. Thêm cột có lập trình (với các ràng buộc) vào NSTableView dựa trên chế độ xem?
- 16. SQL: Ràng buộc duy nhất khi cột là một giá trị nhất định
- 17. Làm cách nào để tạo một ràng buộc duy nhất của SQL dựa trên 2 cột?
- 18. Ràng buộc duy nhất có điều kiện trong oracle db
- 19. Ràng buộc duy nhất với giá trị được xác định
- 20. MySQL: Ràng buộc duy nhất trên nhiều trường
- 21. Hợp nhất các tệp di chuyển db/di chuyển
- 22. kiểm tra ràng buộc duy nhất trong JPA
- 23. mysql kết hợp các phím duy nhất
- 24. Sự kết hợp của hai cột hạn chế duy nhất
- 25. 'không hợp lệ để tạo lỗi ràng buộc mặc định' khi cố gắng thêm ràng buộc vào bảng hiện có
- 26. Làm thế nào để xác định rằng một sự kết hợp của các cột phải là một ràng buộc duy nhất bằng cách sử dụng chú thích?
- 27. Ràng buộc duy nhất với EFCodeFirst và SqlCe4
- 28. Kết hợp Generics với các ràng buộc khác nhau
- 29. diff git duy nhất để hợp nhất cam kết
- 30. Việc tạo một ràng buộc duy nhất trên một cột có tự động tạo chỉ mục không?
Tôi nghĩ rằng đó là thêm một chỉ mục duy nhất, * không * một ràng buộc. Hay chỉ số cũng thêm ràng buộc? –
Không, tất cả đều tốt. Lỗi của tôi! Ràng buộc duy nhất đi kèm với chỉ mục duy nhất. –
Tôi đồng ý với @ paul-cantrell: không có cách nào để chỉ thêm ràng buộc, không phải chỉ mục (có ảnh hưởng lưu trữ db) –