2011-02-24 18 views
1

我是MySQL的新手,並且正在創建一個複雜的EER圖。創建後,我「轉發工程師...」模型並擊中可怕的錯誤:錯誤1005:無法創建表'xxx.xxx'(errno:121)。我創建了另一個具有1:M關係的兩個表的簡化模型,但是使用「id_」作爲主鍵和外鍵名。這工作。什麼是「ID_」和「ID」和「ID」導致錯誤1005:無法創建表'xxx.xxx'(錯誤:121)

i.e. 
TABLE_A 
    id_TABLE_A INT 

TABLE_B 
    id_TABLE_B INT 
    id_TABLE_A INT 

,其中,有一個TABLE_A [1]之間一對多的關係 - < [M]表-B,並且TABLE_B.id_TABLE_A是外鍵

看着我複雜的EER圖,我注意到我對主鍵和外鍵名稱使用了「id」,沒有下劃線。我在「id」後插入了下劃線,Forward工程師對模型進行了處理,並且沒有任何錯誤。所以,這裏有兩個簡單的示例模型,一個使用「id_」,另一個使用「id」。 「id_」不會導致錯誤1005和「id」導致錯誤1005. 任何人有一個想法,爲什麼這種異常發生在MySQL?

============================================= ================================== 很好的模式:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; 
USE `mydb` ; 

DROP TABLE IF EXISTS `mydb`.`TABLE_A` ; 

CREATE TABLE IF NOT EXISTS `mydb`.`TABLE_A` (
    `id_TABLE_A` INT NOT NULL AUTO_INCREMENT , 
    PRIMARY KEY (`id_TABLE_A`) , 
    UNIQUE INDEX `id_TABLE_A_UNIQUE` (`id_TABLE_A` ASC)) 
ENGINE = InnoDB; 


DROP TABLE IF EXISTS `mydb`.`TABLE_B` ; 

CREATE TABLE IF NOT EXISTS `mydb`.`TABLE_B` (
    `id_TABLE_B` INT NOT NULL AUTO_INCREMENT , 
    `id_TABLE_A` INT NOT NULL , 
    PRIMARY KEY (`id_TABLE_B`) , 
    UNIQUE INDEX `id_TABLE_B_UNIQUE` (`id_TABLE_B` ASC) , 
    INDEX `id_TABLE_A` (`id_TABLE_A` ASC) , 
    CONSTRAINT `id_TABLE_A` 
    FOREIGN KEY (`id_TABLE_A`) 
    REFERENCES `mydb`.`TABLE_A` (`id_TABLE_A`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

結果:

Build is successful. 

========================================== =====================================

壞型號:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; 
USE `mydb` ; 


DROP TABLE IF EXISTS `mydb`.`TABLE_A` ; 

CREATE TABLE IF NOT EXISTS `mydb`.`TABLE_A` (
    `idTABLE_A` INT NOT NULL AUTO_INCREMENT , 
    PRIMARY KEY (`idTABLE_A`) , 
    UNIQUE INDEX `idTABLE_A_UNIQUE` (`idTABLE_A` ASC)) 
ENGINE = InnoDB; 


DROP TABLE IF EXISTS `mydb`.`TABLE_B` ; 

CREATE TABLE IF NOT EXISTS `mydb`.`TABLE_B` (
    `idTABLE_B` INT NOT NULL AUTO_INCREMENT , 
    `idTABLE_A` INT NOT NULL , 
    PRIMARY KEY (`idTABLE_B`) , 
    UNIQUE INDEX `idTABLE_B_UNIQUE` (`idTABLE_B` ASC) , 
    INDEX `idTABLE_A` (`idTABLE_A` ASC) , 
    CONSTRAINT `idTABLE_A` 
    FOREIGN KEY (`idTABLE_A`) 
    REFERENCES `mydb`.`TABLE_A` (`idTABLE_A`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

結果:

Executing SQL script in server 
ERROR: Error 1005: Can't create table 'mydb.table_b' (errno: 121) 

CREATE TABLE IF NOT EXISTS `mydb`.`TABLE_B` (
    `idTABLE_B` INT NOT NULL AUTO_INCREMENT , 
    `idTABLE_A` INT NOT NULL , 
    PRIMARY KEY (`idTABLE_B`) , 
    UNIQUE INDEX `idTABLE_B_UNIQUE` (`idTABLE_B` ASC) , 
    INDEX `idTABLE_A` (`idTABLE_A` ASC) , 
    CONSTRAINT `idTABLE_A` 
    FOREIGN KEY (`idTABLE_A`) 
    REFERENCES `mydb`.`TABLE_A` (`idTABLE_A`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 

SQL script execution finished: statements: 8 succeeded, 1 failed 
+0

你爲什麼不在反引號中包含標識符? – 2011-02-24 20:45:04

+0

我從來沒有使用反引號 - 除非是保留字或者你想要空格,否則什麼都是浪費時間和精力 - 所以要避免保留字和空格 - 簡單。 – 2011-02-24 20:52:53

回答

1

這,如果你的約束名稱與另一名稱衝突的發生正常。看到評論在http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.htmlhttp://forums.mysql.com/read.php?22,33999,76181#msg-76181

但在這裏...一個MySQL的錯誤?

+0

嗨,喬,謝謝你的迴應,我沒有在這裏寫SQL代碼......這是它是如何使用「Forward Engineer ...」生成的,因此反引號。我只是複製並粘貼它。但「反引號」除了我的帖子之外。這裏有趣的是預先「id_」不會生成1005錯誤,並且使用「id」生成1005錯誤,其他全部相同。嘗試一下。 – 2011-02-25 21:57:23

+0

嗨膠囊,這就是我也在想什麼(即一個MySQL錯誤),因爲除了「id_」和「id」之外,其他的一切都是相同的。有一個集中的地方,我可以報告潛在的mysql錯誤嗎? – 2011-02-25 22:05:55

+0

http://bugs.mysql.com/就是這個地方。 – Capsule 2011-02-27 10:52:08

相關問題