2008-12-05 40 views
5

Tôi có một vấn đề rất đơn giản và một giải pháp sẽ hoạt động, nhưng tôi đang tìm một giải pháp đơn giản hơn.Khóa chính hai cột trong MySQL

Tôi muốn ngăn các hàng được thêm vào cơ sở dữ liệu khi nhiều giá trị bằng giá trị hiện tại. Ví dụ: nếu a2 = a1 AND b2 = b1 thì dữ liệu bị từ chối. Nếu chỉ a2 = a1 hoặc chỉ b2 = b1 thì được phép. Về cơ bản tôi muốn nó hoạt động như một khóa chính yêu cầu cả hai giá trị phải khớp.

Tôi biết tôi có thể thực hiện việc này thông qua xác thực trước khi tôi ghi vào cơ sở dữ liệu - ví dụ: chọn * trong đó a = 'a2' và b = 'b2' và sau đó tránh ghi dữ liệu mới khi tôi nhận kết quả. Những gì tôi muốn làm là kích hoạt một thiết lập MySQL, như khóa chính, sẽ chặn dữ liệu như thế này tự động.

Tôi không quen thuộc với MySQL bên ngoài các tính năng cơ bản, vì vậy xin lỗi nếu điều này là dễ dàng. Googling cho tất cả mọi thứ xung quanh chỉ số duy nhất và khóa chính không giúp được gì.

Trả lời

10

Tạo chỉ mục duy nhất cho các cột mà bạn muốn là duy nhất.

Ví dụ:

CREATE UNIQUE INDEX index_name ON table(col1, col2); 

Xem MySQL Create index manual.

+0

http: // dev.mysql.com/doc/refman/4.1/en/create-index.html – Chris

0

Bạn muốn sử dụng cú pháp MySQL CONSTRAINT khi tạo bảng (hoặc thay đổi bảng hiện có).

+0

http://dev.mysql.com/doc/refman/4.1/en/constraint-primary-key.html – Chris

0

Ngoài những gì gcores nói, tôi muốn thêm rằng đề xuất thay thế của bạn, xác thực trong lớp ứng dụng, là một điều xấu để làm. Điều gì sẽ xảy ra nếu hai ứng dụng đang cố gắng chèn cùng một dữ liệu và chúng được xen kẽ? Cả hai đều có thể kiểm tra, xem dữ liệu không có ở đó và sau đó chèn cả hai. Nếu bạn sử dụng một chỉ mục duy nhất, có hai lợi ích:

  • Người dùng không phải kiểm tra xem giá trị có còn nữa không. Họ chỉ đơn giản là thử các hoạt động, và nếu nó không thành công, có nghĩa là giá trị đã tồn tại. Điều này làm giảm tải trên cơ sở dữ liệu của bạn một chút, và làm cho logic ứng dụng đơn giản hơn.
  • Cơ sở dữ liệu sẽ luôn hợp lệ vì nó thực thi chính các quy tắc. Việc làm việc với cơ sở dữ liệu dễ dàng hơn nhiều khi bạn có thể giải thích về các quy tắc cứng, thay vì crapshoot của "chúng tôi hy vọng sẽ không có bản sao, nhưng nó có thể là ..."
Các vấn đề liên quan