Mam dwie tabele, users i hubs. Gdy użytkownik utworzy konto, moje zaplecze wykonuje nowy wiersz w users table (wypełnienie wszystkich kolumn wiersza z wyjątkiem kolumny {x3}}, ponieważ nie jest jeszcze znany).

Gdy użytkownik się zarejestrował, są witane z ekranem konfiguracji, do którego otrzymają hubID z produktu zewnętrznego, do którego łączy się aplikacja. Chcę następnie zaktualizować ich user row wewnątrz users table i dodaj hubID do ich wiersza (który jest obecnie null) i jednocześnie dodaj nowy rząd wewnątrz {{x4} } Gdzie primary key będzie HUBID (ponieważ zawsze będzie wyjątkowy).

Users table ma foreign key, aby odwołuje się do rzędu wewnątrz {x2}}.

Tabela użytkowników.

+----------+-------------+------+-----+---------+----------------+
| 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    |
+----------+-------------+------+-----+---------+----------------+

Tabela koncentratora

+-----------+------------+------+-----+---------+----------------+
| 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   |     |         |                |
+-----------+------------+------+-----+---------+----------------+

W tej chwili używam zapytania:

update users set hubID = 'hub123' where userID = '1';

Aby dodać nowy hubid do odpowiedniego wiersza wewnątrz users table. Ale otrzymuję ten błąd:

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)

Nie wiem, jak zaktualizować klucz obcy i dodać nowy wiersz w innej tabeli z tym samym kluczem, więc oboje reprezentują się nawzajem. Mój model w tej chwili będzie działał, gdybym znał Hubid podczas tworzenia user's row, ale to po prostu niemożliwe dla mojego projektu.

Oto skrypt:

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:

CREATE TABLE IF NOT EXISTS `database`.`hubs` (
  `hubID` VARCHAR(50) NOT NULL,
  `isSetup` TINYINT NOT NULL DEFAULT 0,
  `hubSWVersion` DECIMAL(3,2) NOT NULL DEFAULT 0.1,
  `dateAdded` DATETIME NOT NULL,
   PRIMARY KEY (`hubID`))
ENGINE = InnoDB;
0
Nathan 9 październik 2020, 20:53

1 odpowiedź

Najlepsza odpowiedź

Prawdopodobnie chcesz user.username być wyjątkowym. W każdym razie, zakładam, że jest to. Nawet jeśli nie jest to lekarstwo, które opiszę później. Rozwiązanie po prostu robi wstawki we właściwej kolejności. Na przykład:

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';

Zobacz db-fiddle

Zakładam, że kolumny username są unikalne, mogę wykonać ostatnią aktualizację, używając znanej {x1}}. Ale nawet jeśli założenie nie jest poprawne, zawsze można pobrać ostatni włożony klucz autoinsert (tj. Kolumna userId) z {x2}}, a następnie użyj kolumny userId w klauzuli gdzie klauzula.

0
Booboo 9 październik 2020, 21:04