我正在尝试查询 MySQL 服务器以确定有关数据库的信息,以便构建一些代码。
为此,我使用Java JDBC和INFORMATION_SCHEMA表非常成功,但问题是我需要确定表关系是OneToOne、OneToMany还是ManyToMany。我找不到实现这一目标的好方法,如果有人可以帮助我一点,并且如果它可能使用不是 MySQL 特定和可靠的解决方案,我会很高兴,因此它可以帮助其他人。
我在stackoverflow中发现了这个问题,但它不能解决问题: how-to-determine-cardinality-of-foreign-key-using-mysql
编辑(更多) 为了进一步解释我的问题,我将添加更多信息。目前我正在使用 MySQL 与 InnoDB 和 MySQL Workbench 来创建 EER 图并生成 SQL 来创建数据库。
我试图在我的 Java 应用程序中对两个现有表之间的关系进行逆向工程,以确定一个表是OneToOne、OneToMany还是ManyToMany。问题是,当我在 MySQL Workbench 中设计模型并在两个表之间创建关系时,我看不出非识别 1:1 和非识别 1:N 之间有任何区别,即使它们的 SQL 输出相同。
非识别 1:1
CREATE TABLE IF NOT EXISTS `TestDB`.`table1` (
`var1` BIT(1) NOT NULL,
`var2` BIT(8) NOT NULL,
`var3` VARCHAR(45) NULL DEFAULT NULL,
`var4` INT(11) NOT NULL,
`table2_var1` INT(11) NOT NULL,
PRIMARY KEY (`var1`, `var2`),
INDEX `fk_table1_table2_idx` (`table2_var1` ASC),
CONSTRAINT `fk_table1_table2`
FOREIGN KEY (`table2_var1`)
REFERENCES `TestDB`.`table2` (`var1`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
非识别 1:n
CREATE TABLE IF NOT EXISTS `TestDB`.`table1` (
`var1` BIT(1) NOT NULL,
`var2` BIT(8) NOT NULL,
`var3` VARCHAR(45) NULL DEFAULT NULL,
`var4` INT(11) NOT NULL,
`table2_var1` INT(11) NOT NULL,
PRIMARY KEY (`var1`, `var2`),
INDEX `fk_table1_table2_idx` (`table2_var1` ASC),
CONSTRAINT `fk_table1_table2`
FOREIGN KEY (`table2_var1`)
REFERENCES `TestDB`.`table2` (`var1`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
令人惊奇的是,当我使用 MySQL Workbench 对数据库进行反向操作时,看看它是否可以猜测它是1:1还是1:n,它实际上能够猜到它,图中有正确的关系箭头!!!也许它将引用存储为唯一的某处,或者 InnoDB 在其自己的供应商特定的 INFORMATION_SCHEMA 上有此引用,但我想在我的应用程序上复制此行为。
关于如何实现这一目标的任何想法?