我在vb.net
中开发了一个同步模块,因此为了避免使用id
在不同的记录上重复GUID
。现在我要做的是在我的桌子上将GUID设置为primary key (PK)
。这是两个表的结构:
用户
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
表中将user_settings
设置为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 - 无法添加外键约束
我做错了什么?
答案 0 :(得分:3)
父字段(用户中的字段)需要是主键。您将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。
答案 1 :(得分:0)
您正在尝试使用一列,即' GUID' user_setting表作为主键和外键。您不能使用与PK和FK相同的列。
主键用于强制表中的唯一性,并且是特定记录的唯一标识符。
外键用于参照完整性,以确保另一个表中存在值。
外键需要引用另一个表中的主键。
如果你想拥有一个也是唯一的外键,你可以制作一个FK约束,并为同一个字段添加一个唯一的索引/约束。
取而代之的是' id_users'列主键和“GUID”#39;列是' user_setting'的外键表。并制作' GUID' '用户'的列表一个主键。然后,它会正常工作。