无法添加外键约束(GUID)

13 浏览
0 Comments

无法添加外键约束(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我做错了什么?

0
0 Comments

在这个问题中,你正在尝试将'user_setting'表中的一列'GUID'同时用作主键和外键。但是,你不能将同一列用作主键和外键。

主键用于在表中强制唯一性,并作为某个记录的唯一标识符。

外键用于引用完整性,确保值存在于另一个表中。

外键需要引用另一个表中的主键。

如果你想要一个既是外键又是唯一的键,你可以创建一个外键约束,并在该字段上添加唯一索引/约束。

相反,将'user_setting'表的'id_users'列设为主键,并将'GUID'列设为'user_setting'表的外键。并将'users'表的'GUID'列设为主键。然后,问题将得到解决。

0
0 Comments

在上述代码中,出现了一个无法添加外键约束的问题(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都将被删除。

0