如何更新NULL外键并在另一个表中引用相同的键创建新行?

问题描述

我有两个表usershubs。一旦用户创建了帐户,我的后端就会在users table内创建新行(填充行中除hubID列之外的所有列,因为尚不知道)。

用户注册后,会看到一个设置屏幕,他们将在该屏幕上从应用程序连接到的外部产品获得hubID。然后,我想在user row内更新其users table并将hubID添加到其行(当前为空)中,同时在{{1}内添加新行},其中hubs table将是hubID(因为它将始终是唯一的)。

primary key具有Users table来引用foreign key中的一行。

用户

hubs table

集线器表

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| UserID   | int(11)     | NO   | PRI | NULL    | auto_increment |
| Username | varchar(25) | NO   |     |         |                |
| Email    | varchar(25) | NO   |     |         |                |
| Password | varchar(50) | NO   |     |         |                |
| hubID    | varchar(50) | YES  |     |         | foreign_key    |
+----------+-------------+------+-----+---------+----------------+

此刻,我正在使用查询

+-----------+------------+------+-----+---------+----------------+
| Field     | Type       | Null | Key | Default | Extra          |
+-----------+------------+------+-----+---------+----------------+
| hubID     | varchar(50)| NO   | PRI |         |                |
| isSetup   | BOOLEAN    | NO   |     | 0       |                |
| SWVersion | DOUBLE(2,3)| NO   |     | 0.1     |                |
| dateAdded | TIMESTAMP  | NO   |     |         |                |
+-----------+------------+------+-----+---------+----------------+

将新的hubID添加update users set hubID = 'hub123' where userID = '1'; 内的相关行中。但我收到此错误

users table

我不知道如何更新外键并在具有相同键的不同表中添加新行,以便它们彼此代表。如果我在创建Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`database`.`users`,CONSTRAINT `fk_users_hubs1` FOREIGN KEY (`hubID`) REFERENCES `hubs` (`hubID`) ON DELETE CASCADE ON UPDATE CASCADE) 时知道集线器ID,那么当前的模型就可以工作,但这对我的设计而言根本不可能。

这是脚本:

user's row

users table

CREATE TABLE IF NOT EXISTS `database`.`users` ( `userID` INT NOT NULL AUTO_INCREMENT,`username` VARCHAR(50) NOT NULL,`email` VARCHAR(255) NOT NULL,`password` VARCHAR(255) NOT NULL,`hubID` VARCHAR(50) NULL,PRIMARY KEY (`userID`),INDEX `fk_users_hubs1_idx` (`hubID` ASC) VISIBLE,CONSTRAINT `fk_users_hubs1` FOREIGN KEY (`hubID`) REFERENCES `database`.`hubs` (`hubID`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB;

hubs table

解决方法

您可能还希望user.username也是唯一的。无论如何,我假设是这样。即使不是,也有补救措施,我将在后面介绍。解决方案只是按照正确的顺序进行插入。例如:

insert into users(username,email,password) values('Booboo','Booboo@nowhere.atall','password');
insert into hubs(hubID,isSetup,dateAdded) values('hubBooboo',1,now());
update users set hubId = 'hubBooboo' where username = 'Booboo';

See db-fiddle

我假设因为username列是唯一的,所以我可以使用已知的username进行最后一次更新。但是,即使该假设不正确,您也始终可以使用userId检索最后插入的自动插入键(即列SELECT LAST_INSERT_ID()),然后在where子句中使用列userId