无法添加外键约束(GUID)
无法添加外键约束(GUID)
我在vb.net
中开发了一个同步模块,为了避免不同记录上的重复id
,我使用了GUID
。现在我想做的是将GUID设置为我的表的主键(PK)
。这是两个表的结构:\nUSERS\n
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;
\nUSER_SETTINGS\n
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;
\n你可以看到,我在user_settings
表中将FK
设置为GUID字段,GUID是从users
表中获取的,方法如下:\n
ALTER TABLE `user_settings` ADD CONSTRAINT `user_settings_ibfk_1` FOREIGN KEY (`GUID`) REFERENCES `users` (`GUID`) ON DELETE CASCADE ON UPDATE CASCADE;
\n但是我收到了这个错误信息:\n
\n1215 - 无法添加外键约束\n
\n我做错了什么?
在上述代码中,出现了一个无法添加外键约束的问题(Cannot add foreign key constraint (GUID))。出现这个问题的原因是在user_settings表中的GUID字段被定义为主键,这是不合理的。应该将users表中的GUID字段作为主键,在user_settings表中作为普通字段。然后,关系就能正常建立。或者在user_settings表中创建一个ID字段,并使用这两个ID字段来创建外键约束。
以下是修复这个问题的解决方法:
首先,将users表中的GUID字段改为主键,将user_settings表中的GUID字段改为普通字段,如下所示:
CREATE TABLE IF NOT EXISTS `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`GUID` char(36) NOT NULL,
...
PRIMARY KEY (`GUID`),
...
) 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,
...
PRIMARY KEY (`id`),
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后,将user_settings表中的外键约束修改为使用ID字段,如下所示:
ALTER TABLE `user_settings`
ADD CONSTRAINT `user_settings_ibfk_1` FOREIGN KEY (`id`) REFERENCES `users` (`GUID`) ON DELETE CASCADE ON UPDATE CASCADE;
通过以上修改,问题将得到解决。这样一来,一个用户的所有user_settings都将被删除。