2013-02-12 16 views
5

Có cách nào để tạo một chỉ mục duy nhất trên các bảng trong cơ sở dữ liệu MySQL không?Có thể tạo một ràng buộc duy nhất (chỉ mục) trên nhiều bảng không?

Bằng cách độc đáo, ý tôi là,

   table A ids=1,2,5,7... 

       table B ids=3,4,6,8... 
+0

Thật không may ràng buộc này (một "khóa phân phối") là không thể mô hình hóa như một ràng buộc quan hệ chuẩn SQL. Nó có thể được mô phỏng theo nhiều cách, nhưng tôi có các cách tiếp cận khác nhau nói chung là "icky" - mặc dù đôi khi tôi vẫn tiếp tục cố gắng! - và cố hết sức để tránh tình trạng này vào những ngày này. Tôi đề nghị cố gắng đại diện cho mô hình theo cách "thân thiện với SQL" hơn, nếu có thể. –

Trả lời

8

Tôi nghĩ, nó không phải là có thể bằng cách trực tiếp tạo ra một hạn chế. Nhưng có một số giải pháp để bạn có được ID duy nhất.

Một đề xuất sẽ là sử dụng TRIGGER. Tạo kích hoạt TRƯỚC KHI INSERT trên cả hai bảng kiểm tra ID cho sự tồn tại trong thời gian INSERT hoặc UPDATE.

Thứ hai, bằng cách tạo bảng thứ ba chứa số UNIQUE và các bảng khác: TableATableB sau đó sẽ được tham chiếu trên bảng thứ ba.

1

Giống như JW nói, điều này có thể hoạt động tốt với việc sử dụng bảng thứ ba. Trong MySQL, bạn có thể sử dụng các trường nhận dạng để thực hiện điều này dễ dàng hơn. Một ví dụ rất đơn giản sẽ sử dụng các bảng (phiên bản đơn giản của các bảng với chỉ tên mà không biết bất kỳ thông tin thêm):

CREATE TABLE a 
    (
    `id` int, 
    `name` varchar(100), 
    PRIMARY KEY(`id`) 
) 
    ENGINE = INNODB; 
CREATE TABLE b 
    (
    `id` int, 
    `name` varchar(100), 
    PRIMARY KEY(`id`) 
) 
    ENGINE = INNODB; 
CREATE TABLE c 
    (
    `id` int auto_increment, 
    `intable` varchar(10) not null, 
    PRIMARY KEY(`id`) 
) 
    ENGINE = INNODB; 

Sau đó, khi bạn muốn chèn một giá trị ở hai bảng, làm (một chèn mẫu 'Joe' vào a):

INSERT INTO c (`intable`) VALUES ('a'); 
INSERT INTO a (`id`, `name`) 
    SELECT LAST_INSERT_ID() AS id, 'Joe' AS name; 

Lý do duy nhất cho mục nhập ổn định trong c là để bạn biết bảng được tạo cho nó. Bất kỳ loại giá trị nào để chèn vào c đều có thể được sử dụng thay thế.

+0

'LAST_INSERT_ID' có thể tạo ra các hành vi không mong muốn trong các hệ thống đồng thời cao. – singe3

+1

LAST_INSERT_ID không có vấn đề gì trên hệ thống đồng thời cao. Xem tài liệu tại http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id nêu rõ "ID được tạo ra được duy trì trong máy chủ trên một Điều này có nghĩa là giá trị trả về bởi hàm cho một máy khách đã cho là giá trị AUTO_INCREMENT đầu tiên được tạo cho câu lệnh gần đây nhất ảnh hưởng đến cột AUTO_INCREMENT bởi máy khách đó. Giá trị này không bị ảnh hưởng bởi các máy khách khác, ngay cả khi chúng tạo ra các giá trị AUTO_INCREMENT của riêng họ." Bạn đang nghĩ đến SQL Server? –

+0

Không bạn nói đúng, tôi đã nghĩ đến thực tế là một số người sử dụng LAST_INSERT_ID() + 1 để chèn một giá trị khác, có thể thất bại nếu id + 1 đã được sử dụng. – singe3