【问题标题】:Cannot add foreign key constraint (GUID)无法添加外键约束 (GUID)
【发布时间】:2016-04-03 06:17:15
【问题描述】:

我在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 - 无法添加外键约束

我做错了什么?

【问题讨论】:

  • 您在键上没有索引。重复的问题。
  • 索引?你到底是什么意思?
  • “您如何看到我已在 user_settings 表中将 PK 设置为 GUID 字段” - 不,您尝试添加 FK 而不是 PK。
  • 是的,我打错了,无论如何,我想使用 user_settings 的 GUID PK 引用 users 表的 GUID。我编辑了错误的错字。

标签: mysql sql


【解决方案1】:

您正在尝试使用一列,即 user_setting 表的“GUID”作为主键和外键。不能使用与 PK 和 FK 相同的列。

主键用于在表中强制执行唯一性,并且是某个记录的唯一标识符。

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

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

如果您想拥有一个也是唯一的外键,您可以创建一个 FK 约束并向同一字段添加唯一索引/约束。

改为将“id_users”列作为主键,将“GUID”列作为“user_setting”表的外键。并将“用户”表的“GUID”列作为主键。然后,它会正常工作。

【讨论】:

    【解决方案2】:

    父字段(用户中的字段)需要为主键。您将 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 都将被删除。

    【讨论】:

      猜你喜欢
      • 2020-09-26
      • 2020-09-12
      • 2017-07-16
      • 2013-03-10
      • 2021-11-05
      • 2018-02-13
      • 2018-05-16
      相关资源
      最近更新 更多