2010-10-11 65 views
0

我正在嘗試創建通訊錄。並取得了我的表是這樣的:幫助我的表結構

CREATE TABLE `list_`.`contacts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` tinyint(11) NOT NULL, 
    `group` varchar(128) NOT NULL, 
    `first_name` varchar(128) NOT NULL, 
    `last_name` varchar(128) NOT NULL, 
    `address` varchar(128) NOT NULL, 
    `city` varchar(128) NOT NULL, 
    `state` varchar(2) NOT NULL, 
    `zip` int(5) NOT NULL, 
    `phone_number` varchar(16) NOT NULL, 
    `cell_number` varchar(16) NOT NULL, 
    `work_number` varchar(16) NOT NULL, 
    `fax_number` varchar(16) NOT NULL, 
    `email` varchar(128) NOT NULL, 
    `company` varchar(55) NOT NULL, 
    `title` varchar(56) NOT NULL, 
    `notes` text NOT NULL, 
    `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`,`user_id`), 
    KEY `user_id` (`user_id`), 
    KEY `group` (`group`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ; 


CREATE TABLE `list_`.`groups` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` tinyint(11) NOT NULL, 
    `position` int(8) unsigned NOT NULL DEFAULT '0', 
    `name` varchar(128) NOT NULL, 
    `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`,`user_id`), 
    KEY `user_id` (`user_id`), 
    KEY `name` (`name`) 
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 AUTO_INCREMENT=32 ; 

我在這裏的邏輯是,我在contacts表中的所有聯繫人,從那裏我有一個叫group,我用它來篩選聯繫人到組列。

然後我有一張名爲groups的表格,我將使用該表格來跟蹤由特定用戶創建的組,並填寫這些組以便他們可以移動聯繫人。

當組被刪除,我會扔回去不會再讓如果組包含接觸它被刪除的錯誤。我大概可以查詢聯繫人以查看他們屬於哪個組,並且如果他們屬於被刪除的組,那麼我會將他們移動到一個名爲Uncategorized或其他組的組中。

但如果他們選擇接受和刪除組內的所有聯繫人,然後繼續前進,刪除組和屬於該組的所有子行。

我無法在contacts表格製作我Foreing鍵。無論索引和鍵的組合如何,我仍然無法使其工作。

-- 
-- Constraints for table `contacts` 
-- 
ALTER TABLE `list_`.`contacts` 
    ADD CONSTRAINT `contacts_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`), 
    ADD CONSTRAINT `contacts_ibfk_2` FOREIGN KEY (`group`) REFERENCES `groups` (`name`) ON UPDATE CASCADE; 

-- 
-- Constraints for table `groups` 
-- 
ALTER TABLE `list_`.`groups` 
    ADD CONSTRAINT `group_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`); 

此外,有人可以幫我刪除時和更新。爲了幫我找出我如何可以刪除所有的子行,在groups

回答

0

引用name專欄中,我不認爲你應該擁有的MySQL做這麼多繁重,特別是刪除一個組,如果它是空的。是否有任何特定的理由來做到這一點,即如果該組是空的,組可以不再使用?如果你真的想要,你可以用mysql triggers來實現。

作爲防止被簡單地由foriegn鍵上,你已經在組聯繫人進行一組刪除。不過,我強烈建議您使用ID而不是名稱作爲密鑰。

你所說的似乎有衝突,但是:要防止有接觸一組刪除,但你想有一個組中的所有聯繫人當組被刪除,被刪除?

+0

是的,對你最後一個問題。雖然我的問題是,當我運行的代碼時,我不斷收到錯誤,說:無法添加或更新子行:外鍵約束失敗('list_'。,CONSTRAINT 'contacts_ibfk_2' FOREIGN KEY('group')REFERENCES'groups'('name')ON DELETE CASCADE) – Eli 2010-10-11 03:18:20

+0

不,我是說最後兩條語句是反對的。您如何防止刪除擁有聯繫人的羣組,並刪除羣組中的所有聯繫人?該組必須首先沒有聯繫人被刪除。當你得到那個特定的錯誤時,你運行什麼查詢? – 2010-10-11 03:20:24

+0

正是我在我原來的職位,我確實有其他表已經在我的分貝因爲user_id是用戶的外鍵.id – Eli 2010-10-11 03:25:19