2012-09-01 70 views
0

我遇到了一個問題,最簡單的解決方案是添加跨越mysql中多個表的唯一索引。這可能嗎?在多個表中添加唯一索引

爲了這個問題的目的,我將有三張表; statustrackseventsstatustracks表都有一個自動遞增的ID(T_IDS_ID)英寸表中的信息通過觸發器添加到events表中。問題是在tracksstatus中可能有相同的自動遞增ID,這意味着它們可能在events中多次出現相同的ID。

tracks;

CREATE TABLE `tracks` (
`ID` int(11) NOT NULL, 
`url` varchar(200) COLLATE latin1_general_ci NOT NULL, 
`name` varchar(100) COLLATE latin1_general_ci NOT NULL, 
`timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, 
`T_ID` int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (`T_ID`), 
UNIQUE KEY `url` (`url`), 
UNIQUE KEY `T_ID` (`T_ID`), 
KEY `ID` (`ID`), 
CONSTRAINT `tracks_ibfk_1` FOREIGN KEY (`ID`) REFERENCES `members` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci 

status

CREATE TABLE `status` (
`ID` int(11) NOT NULL, 
`status` varchar(300) COLLATE latin1_general_ci NOT NULL, 
`timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, 
`S_ID` int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (`S_ID`), 
UNIQUE KEY `S_ID` (`S_ID`), 
KEY `ID` (`ID`), 
CONSTRAINT `status_ibfk_1` FOREIGN KEY (`ID`) REFERENCES `artists` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci 

events

CREATE TABLE `events` (
`ID` int(11) NOT NULL, 
`action` varchar(100) COLLATE latin1_general_ci NOT NULL, 
`timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, 
`E_ID` int(11) NOT NULL, 
KEY `ID` (`ID`), 
CONSTRAINT `events_ibfk_1` FOREIGN KEY (`ID`) REFERENCES `members` (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT='This table shows what the artist has done and is used feed' 
+0

跨越多個表跨越一個索引是不可能的恐怕。 – BenOfTheNorth

+0

@BenGriffiths啊,這是不好的。關於我可以做什麼的任何想法? –

回答

1

同意,你不能跨多個表的索引。

但是,考慮通過在事件表中添加「源」列並對源鍵和外鍵的組合進行唯一約束來更改模式。這將防止從相同的源插入重複的密鑰。

+0

我並不擔心來自同一來源的重複條目不可能發生。我很擔心來自不同來源的重複條目 –

+0

我認爲,如果不指定來源,您可能會將密鑰從單獨的表中寫入相同的字段,從而冒着完整性。但是,還有另一種方法可以實現您正在嘗試做的事情。您可以在每個表格,軌道和狀態上設置自動增量偏移量。看看這裏:http://stackoverflow.com/questions/10776437/mysql-auto-increment-with-even-or-odd-numbers-only – goatshepard

+0

你可以很容易地從'action'列中識別出來源。插入的動作取決於觸發它的動作,因此它可以是「上傳了曲目」或「有一些新聞」。謝謝,我會看看,我沒有想到這樣做。 –