簡體   English   中英

mysql無法添加外鍵#1215

[英]mysql cannot add foreign key #1215

我已經閱讀了很多關於這個錯誤的回答問題,但沒有一個答案似乎能幫我解決問題。

我得到的錯誤是

#1215 - Cannot add foreign key constraint 

當我show engine innodb status ,它給了我這個信息:

在引用的表中找不到索引,其中引用的列顯示為第一列,或者表中的列類型與引用的表不匹配約束。 請注意,使用> = InnoDB-4.1.12創建的表中ENUM和SET的內部存儲類型已更改,舊表中的此類列不能被新表中的此類列引用。

以下是涉及的表(我正在創建一個創建腳本,並且在執行sql期間出現錯誤)

CREATE TABLE IF NOT EXISTS customer_type (
    customer_type_id int(11) unsigned NOT NULL AUTO_INCREMENT,
    `type` varchar(128) NOT NULL,
    sort int(11) NOT NULL,
    is_active tinyint(1) NOT NULL DEFAULT '1',
    PRIMARY KEY (customer_type_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS location (
    location_id int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(200) NOT NULL,
    email varchar(255) DEFAULT NULL,
    phone varchar(32) DEFAULT NULL,
    address varchar(128) DEFAULT NULL,
    city varchar(255) DEFAULT NULL,
    postal_code varchar(10) DEFAULT NULL,
    shipping_cost float unsigned DEFAULT NULL,
    is_active tinyint(1) NOT NULL DEFAULT '1',
    PRIMARY KEY (location_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS customer_type_location (
    customer_type_id int(11) unsigned NOT NULL,
    location_id int(11) unsigned NOT NULL,
    PRIMARY KEY (customer_type_id,location_id),
    FOREIGN KEY (customer_type_id)
        REFERENCES customer_type(customer_type_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (location_id)
        REFERENCES location(location_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我不明白為什么它說我需要索引引用列,因為你可以清楚地看到引用的列是主鍵,應該隱式創建索引。 所以這個錯誤對我來說似乎沒有意義。

我從這個問題的答案中嘗試了大部分建議,但似乎都沒有幫助。

我以前一直使用PostgreSQL,所以我對大多數MySQL錯誤並不是很熟悉,但這個項目要求我使用MySQL。 任何幫助,將不勝感激。

事實證明問題出在數據庫整理上。 我的db collat​​ion設置為utf8_general_ci ,但它無法正常工作。 我刪除了數據庫,並使用utf8_unicode_ci創建了新數據庫,然后按預期工作。 所以似乎數據庫排序規則和表排序規則應該匹配。

從名為“ 使用FOREIGN KEY約束 ”的手冊頁中,摘錄如下:

MySQL需要外鍵和引用鍵的索引,以便外鍵檢查可以快速,不需要表掃描。 在引用表中,必須有一個索引,其中外鍵列以相同的順序列為第一列。 如果引用表不存在,則會自動在引用表上創建此索引。 如果您創建另一個可用於強制執行外鍵約束的索引,則可以稍后以靜默方式刪除此索引。 如果給定,則使用index_name,如前所述。

所以指數很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM