[英]Cannot add foreign key constraint (GUID)
我在vb.net
开发了一个同步模块,所以为了避免在不同的记录上重复id
,我正在使用GUID
。 现在我要做的是将GUID设置为我的表上的primary key (PK)
。 这是两个表的结构:
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;
用户设置
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;
你怎么看我在user_settings
表中将FK
设置为GUID字段,GUID是从users
表中获取的:
ALTER TABLE `user_settings`
ADD CONSTRAINT `user_settings_ibfk_1` FOREIGN KEY (`GUID`) REFERENCES `users` (`GUID`) ON DELETE CASCADE ON UPDATE CASCADE;
但我发现此错误消息:
1215 - 无法添加外键约束
我做错了什么?
父字段(用户中的字段)需要是主键。 您将user_settings表中的GUID字段定义为主键。 这没有意义。 您应该在user_settings as simple字段中将用户中的GUID作为主键。 然后关系有效。 或者,您在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。
您正在尝试使用一列,即user_setting表的“GUID”作为主键以及外键。 您不能使用与PK和FK相同的列。
主键用于强制表内的唯一性,并且是特定记录的唯一标识符。
外键用于引用完整性,以确保另一个表中存在值。
外键需要引用另一个表中的主键。
如果您想拥有一个唯一的外键,您可以制作一个FK约束并为该相同的字段添加唯一的索引/约束。
而是将'id_users'列设为主键,将'GUID'列设为'user_setting'表的外键。 并将'users'表的'GUID'列设为主键。 然后,它会正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.