2015-12-29 108 views
1

我在vb.net中開發同步模塊,因此爲避免在不同記錄上重複使用id我使用的是GUID。現在我想要做的是在我的桌子上設置GUID爲primary key (PK)。這是兩個表的結構:無法添加外鍵約束(GUID)

USERS

CREATE TABLE IF NOT EXISTS `users` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `GUID` char(36) NOT NULL, 
    `first_name` varchar(256) DEFAULT NULL, 
    `last_name` varchar(512) DEFAULT NULL, 
    `email` varchar(512) DEFAULT NULL, 
    `mobile_number` varchar(128) DEFAULT NULL, 
    `phone_number` varchar(128) DEFAULT NULL, 
    `address` varchar(256) DEFAULT NULL, 
    `city` varchar(256) DEFAULT NULL, 
    `state` varchar(128) DEFAULT NULL, 
    `zip_code` varchar(64) DEFAULT NULL, 
    `notes` text, 
    `id_roles` bigint(20) unsigned NOT NULL, 
    `data` int(11) NOT NULL, 
    `lastUpdated` varchar(36), 
    PRIMARY KEY (`id`), 
    KEY `id_roles` (`id_roles`) 
) ENGINE=InnoDB AUTO_INCREMENT=85 DEFAULT CHARSET=utf8; 

USER_SETTINGS

CREATE TABLE IF NOT EXISTS `user_settings` (
    `id_users` bigint(20) unsigned NOT NULL, 
    `GUID` char(36) NOT NULL, 
    `username` varchar(256) DEFAULT NULL, 
    `password` varchar(512) DEFAULT NULL, 
    `salt` varchar(512) DEFAULT NULL, 
    `working_plan` text, 
    `notifications` tinyint(4) DEFAULT '0', 
    `google_sync` tinyint(4) DEFAULT '0', 
    `google_token` text, 
    `google_calendar` varchar(128) DEFAULT NULL, 
    `sync_past_days` int(11) DEFAULT '5', 
    `sync_future_days` int(11) DEFAULT '5', 
    `lastUpdated` varchar(36), 
    PRIMARY KEY (`GUID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

怎麼可以看到我設置的FK爲GUID場user_settings表,該GUID取自users表中:

ALTER TABLE `user_settings` 
ADD CONSTRAINT `user_settings_ibfk_1` FOREIGN KEY (`GUID`) REFERENCES `users` (`GUID`) ON DELETE CASCADE ON UPDATE CASCADE; 

但我GE此錯誤消息:

1215 - 不能添加外鍵約束

我做了什麼錯?

+0

您沒有鑰匙上的索引。重複的問題。 – DanFromGermany

+0

索引?你究竟是什麼意思? – Dillinger

+1

「你如何看到我已經將PK設置爲user_settings表中的GUID字段」 - 不,你試圖添加FK而不是PK。 – DanFromGermany

回答

3

父字段(用戶字段)需要是主鍵。您將user_settings表中的GUID字段定義爲主鍵。那沒有道理。您應該將用戶的GUID作爲主鍵,在user_settings中作爲簡單字段。然後這種關係起作用。或者,您在user_settings中創建一個ID字段,並使用2個id字段來創建外鍵約束。

CREATE TABLE IF NOT EXISTS `users` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `GUID` char(36) NOT NULL, 
    `first_name` varchar(256) DEFAULT NULL, 
    `last_name` varchar(512) DEFAULT NULL, 
    `email` varchar(512) DEFAULT NULL, 
    `mobile_number` varchar(128) DEFAULT NULL, 
    `phone_number` varchar(128) DEFAULT NULL, 
    `address` varchar(256) DEFAULT NULL, 
    `city` varchar(256) DEFAULT NULL, 
    `state` varchar(128) DEFAULT NULL, 
    `zip_code` varchar(64) DEFAULT NULL, 
    `notes` text, 
    `id_roles` bigint(20) unsigned NOT NULL, 
    `data` int(11) NOT NULL, 
    `lastUpdated` varchar(36), 
    PRIMARY KEY (`id`), 
    KEY `id_roles` (`id_roles`) 
) ENGINE=InnoDB AUTO_INCREMENT=85 DEFAULT CHARSET=utf8; 


CREATE TABLE IF NOT EXISTS `user_settings` (
    `id_users` bigint(20) unsigned NOT NULL, 
    `id` bigint(20) unsigned NOT NULL, 
    `GUID` char(36) NOT NULL, 
    `username` varchar(256) DEFAULT NULL, 
    `password` varchar(512) DEFAULT NULL, 
    `salt` varchar(512) DEFAULT NULL, 
    `working_plan` text, 
    `notifications` tinyint(4) DEFAULT '0', 
    `google_sync` tinyint(4) DEFAULT '0', 
    `google_token` text, 
    `google_calendar` varchar(128) DEFAULT NULL, 
    `sync_past_days` int(11) DEFAULT '5', 
    `sync_future_days` int(11) DEFAULT '5', 
    `lastUpdated` varchar(36), 
    PRIMARY KEY (`GUID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE `user_settings` 
ADD CONSTRAINT `user_settings_ibfk_1` FOREIGN KEY (`id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 

在這個例子中,用戶的所有user_settings將被刪除。

0

您正試圖使用​​user_setting表的'GUID'作爲主鍵以及外鍵。您不能使用與PK和FK相同的列。

主鍵用於強制表內的唯一性,並且是某個記錄的唯一標識符。

一個外鍵用於參照完整性,以確保一個值存在於另一個表中。

外鍵需要引用另一個表中的主鍵。

如果你想擁有一個也是唯一的外鍵,你可以創建一個FK約束,併爲該字段添加一個唯一索引/約束。

改爲將'id_users'列設爲主鍵,'GUID'列設置'user_setting'表的外鍵。並將'users'表的'GUID'列作爲主鍵。然後,它會正常工作。