2010-07-13 19 views
7

Chúc mừng tất cả. Người mới ở đây. Câu hỏi về ngăn chặn mục trùng lặp trong biểu mẫu web đơn giản của tôi.Tạo khóa duy nhất trong bảng MySQL đề cập đến ngày

Bản ghi người dùng bảng của tôi từ biểu mẫu web và được phân biệt theo ngày, ví dụ: NGÀY(). Cách ngăn người dùng có cùng tên để nhập thông tin hai lần vào một ngày, ví dụ: không thể nhập cùng một tên người dùng hai lần trong cùng một ngày, nhưng có thể nhập vào ngày khác?

Hy vọng ai đó có thể tư vấn cho tôi về vấn đề này. Cảm ơn là trước.

Trả lời

9

bảng của bạn nên có những:

create table tablename (
... 
user_id bigint, -- or whatever 
date_created date, 
unique key(user_id, date_created) 
... 
); 
+0

Cảm ơn tất cả các lời khuyên :) Đã cố gắng như được đề xuất, nó sẽ ngăn chặn cùng một mục nhập từ cùng một ngày. Nhưng khi tôi thay đổi ngày sang ngày tiếp theo, nó sẽ hiển thị 'tên trùng lặp' không thể nhập bản ghi. Bạn có thể nhập lại cùng một NAME vào ngày DATE khác không? – cys

+0

Có lẽ bạn cũng có một khóa duy nhất trên tên? Hãy chạy lệnh này: 'hiển thị tạo tablename' và đăng kết quả. – ceteras

+0

Xin cảm ơn các bạn, tôi đã cố gắng chạy nó. Tôi đặt trong câu lệnh if..else để xác thực nếu bất kỳ hàng nào có DATE và NAME giống nhau, sau đó không thực hiện nhập bản ghi, nếu không, hãy nhập bản ghi. Tôi đã nhận ý tưởng này từ tất cả các bạn rằng việc tạo NAME và DATE là duy nhất. Cảm tạ! :) – cys

1

Bạn có thể đơn giản tạo một khóa chính composite. Đối với trường hợp của bạn, điều này có nghĩa là khóa chính của bạn phải bao gồm trường ngày tháng cũng như trường tên người dùng.

+1

Điều này cũng có thể. Nhưng các PK tổng hợp có vấn đề khi tạo mối quan hệ với bảng này. Tôi nghĩ rằng chỉ số UNIQUE là cách tiếp cận tốt hơn. –

+0

Tôi đồng ý! Tuy nhiên, tôi chỉ muốn nhận xét rằng tùy chọn "NOT NULL" cho các trường duy nhất là bắt buộc (như bạn đã làm trong mã tạo bảng), vì giá trị NULL cho tên hoặc ngày hủy sự độc đáo (nghĩa là có thể thêm người dùng 'xxx' nhiều lần nếu ngày là NULL). – Javaguru

1

Bằng nhiều cách.

Trước tiên, bạn có thể tạo chỉ mục trên bảng của mình. (Tôi đang sử dụng bảng đơn giản làm ví dụ).

CREATE TABLE `test` (
`id` INT NOT NULL , 
`name` VARCHAR(255) NOT NULL , 
`date` DATE NOT NULL , 
PRIMARY KEY (`id`) 
) ENGINE = MYISAM; 

ALTER TABLE `test` ADD UNIQUE (
`name` , 
`date` 
); 

Đây là cách của MySQL.

Bạn cũng nên thực hiện kiểm tra bằng PHP, mặc dù bạn có thể thực hiện khi chèn (MySQL sẽ trả về lỗi và bạn có thể kiểm tra). Nhưng bạn có thể tạo thêm SELECT trước khi chèn (SELECT * from test WHERE name=USER AND date=DATE) và kiểm tra số lượng bản ghi. Nếu nó lớn hơn 0, bạn hiển thị lỗi.

Khi lưu, bạn hiếm khi lo lắng về một SQL bổ sung. Nếu bạn nên, chỉ cần kiểm tra MySQL tuyên bố cho các lỗi (MySQL cách :)).

Các vấn đề liên quan