问题描述
我有两个表users
和hubs
。一旦用户创建了帐户,我的后端就会在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';
我假设因为username
列是唯一的,所以我可以使用已知的username
进行最后一次更新。但是,即使该假设不正确,您也始终可以使用userId
检索最后插入的自动插入键(即列SELECT LAST_INSERT_ID()
),然后在where子句中使用列userId
。