2013-02-12 85 views
5

有沒有辦法在MySQL數據庫中的表中創建唯一的索引?是否可以在多個表中創建唯一(索引)約束?

通過獨特的,我的意思是,

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

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

不幸的是,這個約束(一個「分佈式密鑰」)不可能被建模爲一個標準的SQL關係約束。它可以用幾種方式進行模擬,但我有各種各樣的方法,通常是「icky」 - 雖然我有時仍然在嘗試! - 盡最大努力避免這種情況。如果可能的話,我建議嘗試以更「SQL友好」的方式表示模型。 – 2013-02-12 05:01:49

回答

8

我認爲,它是不可能通過直接創建的約束。但爲了讓您獲得唯一的ID,有一些解決方案。

一個建議是使用TRIGGER。在兩個表上創建一個BEFORE INSERT觸發器,在INSERTUPDATE期間檢查ID是否存在。

其次,是通過創建第三個表格,其中包含UNIQUE號碼和其他表格:TableATableB將在第三個參考。

1

就像JW所說,這可能會適用於使用第三個表格。在MySQL中,您可以使用標識字段來簡化操作。一個非常簡單的例子是使用這些表(只名稱表的簡單版本,不知道任何進一步的信息):

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; 

然後,當你想在任何一個表中插入值,這樣做(樣本插入'Joe'into a):

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

c中intable條目的唯一原因是你知道它是爲哪個表創建的。可以使用任何類型的值插入到c中。

+0

'LAST_INSERT_ID'可能會在高併發系統中產生意外的行爲。 – singe3 2016-03-31 10:07:17

+1

LAST_INSERT_ID在高度併發的系統上沒有任何問題。請參閱http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id上的文檔,其中指出:「生成的標識在服務器上按照每個標準進行維護,這意味着函數返回給定客戶端的值是該客戶端最近一次影響AUTO_INCREMENT列的語句生成的第一個AUTO_INCREMENT值,該值不會受到其他客戶端的影響,即使它們生成的AUTO_INCREMENT值爲他們自己的。」你在想SQL Server嗎? – 2016-04-20 22:40:10

+0

不,你想的是有些人使用LAST_INSERT_ID()+ 1來插入另一個值,如果已經採用了id + 1,這可能會失敗。 – singe3 2016-04-21 06:44:28