2014-02-22 117 views
4

我試着用下面的CREATE TABLE語句在MySQL中創建一個表:MySQL的:無法創建表

CREATE TABLE `visit` (
    `visit_id` int(11) NOT NULL, 
    `site_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`visit_id`), 
    CONSTRAINT `FK_visit_site` FOREIGN KEY (`site_id`) REFERENCES `site` (`site_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我收到此錯誤:

ERROR 1005 (HY000): Can't create table 'fooschema.visit' (errno: 121)

我用SHOW ENGINE INNODB STATUS命令。這是錯誤消息:

 
------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
140222 7:03:17 Error in foreign key constraint creation for table `fooschema`.`visit`. 
A foreign key constraint of name `fooschema/FK_visit_site` 
already exists. (Note that internally InnoDB adds 'databasename/' 
in front of the user-defined constraint name). 
Note that InnoDB's FOREIGN KEY system tables store 
constraint names as case-insensitive, with the 
MySQL standard latin1_swedish_ci collation. If you 
create tables or databases whose names differ only in 
the character case, then collisions in constraint 
names can occur. Workaround: name your constraints 
explicitly with unique names. 

然後,我用下面的查詢列出所有可用的限制:

select * 
from information_schema.table_constraints 
where constraint_schema = 'fooschema' 

我沒有看到任何約束名爲「FK_visit_site」的結果。

FK_visit_site約束是表訪問的外鍵約束。我放棄了訪問表並嘗試重新創建它。

有沒有辦法可以放棄這個外鍵約束,即使它關聯的表不存在?

+0

你可以只是給你的新密鑰一個不同的名字? – Nanne

+0

是的,我可以。但我真的很想用舊的名字。使用舊名稱很重要。 – toanong

+0

什麼'select * from information_schema。table_constraints其中constraint_name ='FK_visit_site''返回' –

回答

1

你的外鍵已經存在,所以要麼放棄外鍵或重命名你的第二個鍵。

ALTER TABLE `site` DROP FOREIGN KEY `FK_visit_site`; 

或重命名爲其他新的。

CREATE TABLE `visit` (
`visit_id` int(11) NOT NULL PRIMARY KEY, 
`site_id` int(11) NOT NULL, 
CONSTRAINT `FK_visit_site` FOREIGN KEY (`site_id`) REFERENCES `site` (`site_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

新增PRIMARY KEYvisit_id線。

注:

確保site_idsite表在訪問表的site_id完全相同的數據類型。

`site_id` int(11) DEFAULT NULL --//in the `site` table 

The two keys you're coupling must have the exact same datatype (INT NOT NULL), even signedness

+0

在我的情況下,顯式約束名稱很重要,因爲我可能需要稍後以編程方式將其刪除。 – toanong

+0

剛剛嘗試過。同樣的錯誤。 – toanong

+0

嘗試編輯後的版本。下面是現場表: CREATE TABLE'site'( 'site_id' INT(11)NOT NULL, 'location_id' INT(11)DEFAULT NULL, 'site_name' VARCHAR(50)DEFAULT NULL, PRIMARY KEY(' CONSTRAINT'FK_site_location' FOREIGN KEY('location_id')REFERENCES'location'('location_id') )ENGINE = InnoDB DEFAULT CHARSET = utf8; – toanong

0

據我所知,你會得到當你試圖添加一個約束與已經用於其他地方的名稱此錯誤。意思是,在你的情況下,FK FK_visit_site已經被使用過。

如果您嘗試創建的表包含外鍵約束,並且您爲該約束提供了自己的名稱,請記住它在數據庫中必須是唯一的。

您可以運行下面的查詢,找出相同

SELECT 
    constraint_name, 
    table_name 
FROM 
    information_schema.table_constraints 
WHERE 
    constraint_type = 'FOREIGN KEY' 
    AND table_schema = DATABASE() 
ORDER BY 
    constraint_name; 

從這裏後兩者 http://www.thenoyes.com/littlenoise/?p=81

嘗試使用不同的名稱爲您的FK喜歡

CREATE TABLE `visit` (
    `visit_id` int(11) NOT NULL, 
    `site_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`visit_id`), 
    CONSTRAINT `FK_visit_site_New` FOREIGN KEY (`site_id`) 
    REFERENCES `site` (`site_id`), 
) 
+1

約束名稱不在您提到的查詢結果中。我將不得不保留舊名稱。我擔心的是,如果這個名字被用在某個地方,它在哪裏?爲什麼我找不到它? – toanong

+0

我在上面看到你的評論,你放棄了「添加約束」。你還在使用同一個會話嗎?嘗試運行我在不同會話中提到的查詢,看看你是否發現它。 – Rahul

+1

剛在新會話中嘗試了查詢。仍然沒有看到它。外鍵已添加到訪問表中。現在訪問表並不存在。外鍵如何仍然存在? – toanong