我想查詢一個MySQL服務器以確定有關數據庫的信息,以支撐一些代碼。如何以編程方式確定表之間的MySQL關係類型(1:1,1:n,n:m)?
我一直很成功使用的Java JDBC和INFORMATION_SCHEMA表這一點,但問題是,我需要確定一個表關係OneToOne,一對多或多對多。我無法找到實現這一目標的好方法,如果有人能夠幫助我一點,並且如果可能的解決方案不是MySQL特有的,並且可以幫助其他人,我也會很樂意。
我發現這個問題的計算器,但它不會解決問題: how-to-determine-cardinality-of-foreign-key-using-mysql
EDIT(更多) 爲了進一步說明我的問題,我會添加更多的信息。目前我使用InnoDB和MySQL Workbench來創建EER圖並生成SQL來創建數據庫。
我試圖反向工程在我的Java應用程序中現有的兩個表之間的關係,以確定是否一個表是OneToOne,一對多或多對多。問題是,當我在MySQL Workbench中設計模型時,我在兩個表之間創建了一個關係,但我看不到Non-Identifying 1:1和Non-Identifying 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工作臺,看看數據庫它可以猜測它是否是一個1:1或1:n,它實際上能夠猜到它,圖有正確的關係箭!也許它將引用存儲爲唯一的地方,或者InnoDB在自己的供應商特定的INFORMATION_SCHEMA上有這個引用,但我想在我的應用程序中複製這種行爲。
任何想法,我怎麼能做到這一點?
我最初認爲** OneToOne **和** OneToMany **之間的主要可見區別是@OllieJones在前面的答案中指出的,外鍵引用(在本例中爲** a_id **在**表b **)被標記或標記爲UQ(唯一),但令我驚訝的是,在InnoDB中使用MySQL工作臺時,我發現1:1和1:N都沒有標記爲UQ,而當我做反向該數據庫使用MySQL工具,它以某種方式設法檢測1:1和1:N之間的差異。我想知道在這種情況下如何處理這個問題。 感謝您的時間和精力奧利瓊斯 – Lethe 2014-09-29 16:34:37