MySQL Workbench Umbenennungs Constraint
-
30-09-2019 - |
Frage
verwende ich MySQL Workbench meine Datenbank zu entwerfen und dann die SQL exportieren Skript erstellen. Aber wenn ich dieses Skript ausführen, um die Datenbank zu erstellen, bekomme ich einen Fehler - errno: 121
Es stellt sich heraus, dass MySQL Workbench gibt zwei Einschränkungen die gleichen Namen, weil beide Zwänge den gleichen Schlüssel verwenden (Ich habe eine Tabelle mit Primärschlüssel ‚Rollen-ID‘ und ich verweise auf diesen Schlüssel in zwei anderen Tabellen).
Gibt es eine Möglichkeit, wie ich die Einschränkung direkt im Designer umbenennen kann, so dass, wenn ich dich die SQL-Ingenieur-Skript erstellt hat, wird es keine Fehler geben?
Ich habe versucht, einen Doppelklick auf die Beziehung im Designer und geben ihm einen neuen Titel, aber es erzeugt noch das Skript mit dem ursprünglichen Namen.
Ein Teil des erzeugten Skript, das den Fehler erzeugt:
CREATE TABLE IF NOT EXISTS users
.roles
(
roleID
INT NOT NULL AUTO_INCREMENT ,
...
PRIMARY KEY (roleID
) ,
...);
CREATE TABLE IF NOT EXISTS users
.userRoles
(
...
roleID
INT NOT NULL ,
...
CONSTRAINT roleID
FOREIGN KEY (roleID
)
REFERENCES users
.roles
(roleID
));
CREATE TABLE IF NOT EXISTS users
.resourcePrivileges
(
roleID
INT NOT NULL ,
...
CONSTRAINT roleID
FOREIGN KEY (roleID
)
REFERENCES users
.roles
(roleID
));
Lösung
Nicht sicher, wie Sie mit, dass am Ende. Ich habe MySQL Workbench für einen Spin, erstellt zwei Tabellen mit einer FK und es erstellt
-- -----------------------------------------------------
-- Table `mydb`.`users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`users` (
`idusers` INT NULL ,
PRIMARY KEY (`idusers`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`usersRoles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`usersRoles` (
`users_idusers` INT NOT NULL ,
PRIMARY KEY (`users_idusers`) ,
CONSTRAINT `fk_usersRoles_users`
FOREIGN KEY (`users_idusers` )
REFERENCES `mydb`.`users` (`idusers` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Beachten Sie, dass die Beschränkung hat einen eindeutigen Namen ‚fk_usersRoles_users‘, die nicht kopiert bekommen würde, da es Tabellennamen verwendet. Just for fun habe ich eine andere Beziehung zwischen den gleichen Tabellen und standardmäßig I
erhalten-- -----------------------------------------------------
-- Table `mydb`.`usersRoles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`usersRoles` (
`users_idusers` INT NOT NULL ,
`users_idusers1` INT NOT NULL ,
PRIMARY KEY (`users_idusers`, `users_idusers1`) ,
INDEX `fk_usersRoles_users1` (`users_idusers1` ASC) ,
CONSTRAINT `fk_usersRoles_users`
FOREIGN KEY (`users_idusers` )
REFERENCES `mydb`.`users` (`idusers` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_usersRoles_users1`
FOREIGN KEY (`users_idusers1` )
REFERENCES `mydb`.`users` (`idusers` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Welche wieder ein nicht Problem ist (alle oben wird automatisch generiert - ich nur die Tabellennamen festgelegt haben, Primärschlüssel auf referenzierte Tabelle und fügte zwei 1: N-Beziehungen)
. Hinweise: Version 5.2.30
Bearbeiten Vielleicht geschah etwas mit Ihren Wünschen. Der Standardname für die fk Constraints definiert auf dem Modell Tab.
Andere Tipps
Wenn Sie eine Beschränkungen für Fremdschlüssel gesetzt ist, wird nicht assign anderen Namen, dass gleichen Primärschlüssel einiger Tabelle. Also, was ich versuche zu sagen ist, dass der Check alle Indexnamen in allen generierten Skripte, ob es eine Verdoppelung. Benennen Sie zu einem anderen. Dann können Sie gehen ...