【问题标题】:Edit an improperly created constraint编辑不正确创建的约束
【发布时间】:2018-01-02 16:41:05
【问题描述】:

我想我可能错误地创建了一个约束。我有三个表:活动、身份验证、登录。我希望 Authentication 成为“主”表,我将在其中插入数据以创建用户及其详细信息。它将与新创建的表存在一对一的关系(登录中的id 到身份验证中的id),身份验证存储会话ID。第三个表与AuthenticationID 的多行存在一对多关系,对应于登录的id

这是我创建的:

| Login | CREATE TABLE `Login` (
  `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `TimeLoggedIn` text NOT NULL,
  `sessionid` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`),
  KEY `id_2` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1 |

| Authentication | CREATE TABLE `Authentication` (
  `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `userid` varchar(30) NOT NULL,
  `password` varchar(30) NOT NULL,
  `role` varchar(20) NOT NULL,
  `email` varchar(50) DEFAULT NULL,
  `AuthenticationID` int(6) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `Authentication_ibfk_1` FOREIGN KEY (`id`) REFERENCES `Login` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1 |

| Activity | CREATE TABLE `Activity` (
  `num` int(11) NOT NULL AUTO_INCREMENT,
  `AuthenticationID` int(6) unsigned NOT NULL,
  `TorrentMag` mediumtext NOT NULL,
  PRIMARY KEY (`num`),
  KEY `FK_myKey2` (`AuthenticationID`),
  CONSTRAINT `FK_myKey` FOREIGN KEY (`AuthenticationID`) REFERENCES `Authentication` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `FK_myKey2` FOREIGN KEY (`AuthenticationID`) REFERENCES `Authentication` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=104 DEFAULT CHARSET=latin1 |

不幸的是,当我尝试在身份验证中插入一个新行时(在我创建约束之前它一直有效),

INSERT INTO Authentication (userid, password, role, email) VALUES ("user", "SeG^SU;B2_&Uhw", "user", "someone@mydomain.com");

它给出了错误:

Cannot add or update a child row: a foreign key constraint fails (`episodescopy`.`Authentication`, CONSTRAINT `Authentication_ibfk_1` FOREIGN KEY (`id`) REFERENCES `Login` (`id`))

所以我无意中创建了我需要的反比关系?另外我似乎在表 Activity 上创建了一个重复的约束?我怎样才能解决这个问题?

【问题讨论】:

  • userLogin 表中有对应的条目吗?这是我要检查的第一件事,也是错误似乎暗示的内容。
  • 正在创建用户。 Login 表中的 id 会在 Authentication 表中创建用户时更新,反之亦然。
  • 你确定你有这个吗?用户必须存在于 Login 表中之前您可以在Authentication 中引用它。这里是这样吗?
  • 这不是我想要的。我希望在身份验证中创建用户,并在登录中引用。
  • 我尝试删除 FOREIGN KEY 以使用 ALTER TABLE Authentication DROP FOREIGN KEY Authentication_ibfk_1; 再次创建它,然后尝试 ALTER TABLE Login ADD CONSTRAINT FK_Login FOREIGN KEY (id) REFERENCES Authentication (id) ON DELETE CASCADE ON UPDATE CASCADE; 但它给出了错误 ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (episodescopy.#sql-3ed_1b38e, CONSTRAINT FK_Login FOREIGN KEY (id) REFERENCES Authentication (id) ON DELETE CASCADE ON UPDATE CASCADE)

标签: mysql foreign-keys constraints relational-database


【解决方案1】:

这是一个建议,希望至少可以为您指明正确的方向。如果要在Authentication表中创建用户,那么任何其他引用Authentication主键(即id)的表列都应声明为外键引用。

CREATE TABLE Login (
    id int(6) unsigned NOT NULL AUTO_INCREMENT,
    TimeLoggedIn text NOT NULL,
    sessionid varchar(255) NOT NULL,
    PRIMARY KEY (id),
    KEY id (id),
    KEY id_2 (id),
    CONSTRAINT fk_1 FOREIGN KEY (id) REFERENCES Authentication (id)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1

CREATE TABLE Authentication (
    id int(6) unsigned NOT NULL AUTO_INCREMENT,
    userid varchar(30) NOT NULL,
    password varchar(30) NOT NULL,
    role varchar(20) NOT NULL,
    email varchar(50) DEFAULT NULL,
    AuthenticationID int(6) unsigned DEFAULT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1

您当前的设置正好相反,要求用户在Login 中存在,然后才能插入Authentication

【讨论】:

  • 感谢您的帮助。我很难解除约束。最后,将其导出为 .sql,手动编辑并重新创建结构。
  • @philipxy 谁说我不是在mysql里做的?我将 sql 导出到一个文本文件,删除了无效的键,并在 mysql 中重新创建。
  • @philipxy 那是在我修复它之前。所有的警察都怎么了?这仍然是经验不足的程序员可以澄清疑问的地方,不是吗?我的问题是否有某些特定方面不符合规则或建议?如果是这样,欢迎您提出建设性的批评或有用的答案。
猜你喜欢
  • 2020-11-10
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
相关资源
最近更新 更多