2017-04-21 178 views
2

我有兩個在MySQL中創建的表。他們的創建查詢如下MySQL錯誤代碼:1215.無法添加外鍵約束

CREATE TABLE ix_consultant_affected_columns (
    master_id int(10) NOT NULL, 
    logging_session int(10) NOT NULL, 
    text_id bigint(20) NOT NULL, 
    table_id int(10) NOT NULL, 
    column_id int(10) NOT NULL, 
    PRIMARY KEY (text_id, master_id, logging_session, table_id, column_id) 
) ENGINE = INNODB DEFAULT charset = latin1; 

CREATE TABLE ix_consultant_query_text (
    master_id int(10) NOT NULL, 
    logging_session int(10) NOT NULL, 
    text_id bigint(20) NOT NULL, 
    count int(10) NOT NULL, 
    discarded tinyint(3) DEFAULT NULL, 
    query_type varchar(1) DEFAULT NULL, 
    no_tuner_score float DEFAULT NULL, 
    num_rows_affected float DEFAULT NULL, 
    text_plan longtext, 
    PRIMARY KEY (logging_session, master_id, text_id) 
) ENGINE = INNODB DEFAULT charset = latin1; 

現在我想在alter query中應用外鍵。但它給
錯誤代碼:1215無法添加外鍵約束
的ALTER查詢:

ALTER TABLE ix_consultant_affected_columns 
    ADD FOREIGN KEY (master_id) REFERENCES ix_consultant_query_text (master_id), 
    ADD FOREIGN KEY (logging_session) REFERENCES ix_consultant_query_text (logging_session), 
    ADD FOREIGN KEY (text_id) REFERENCES ix_consultant_query_text (text_id); 

我試圖尋找兩者之間的約束或數據類型的差異。但我無法確定問題。
注意:如果我只使用logging_session列運行alter query,查詢可以正常工作並應用外鍵。問題是master_id和text_id

編輯:

我發現的問題是,更改查詢不引用表的順序排列。在ix_consultant_query_text表中的主索引sequnce是:

  1. logging_session
  2. master_id
  3. text_id

所以,當我創建了引用表的主索引序列中的變更查詢它工作得很好。

ALTER TABLE ix_consultant_affected_columns 
    ADD FOREIGN KEY (logging_session,master_id,text_id) REFERENCES ix_consultant_query_text(logging_session,master_id,text_id) 

現在的問題是,我動態地創建這種變更查詢,那麼,有沒有一種方式來獲得從引用表中的列(主索引)的順序?

回答

0

您正在嘗試三家外資鍵在ix_consultant_query_text表添加到下一個字段:

  • text_id
  • master_id
  • logging_session

但只有ix_consultant_query_textlogging_session是獨一無二的。 創建外鍵需要所有引用的字段都是唯一的。

+0

主鍵應用於ix_consultant_query_text中的text_id,master_id和logging_session。那麼logging_session如何唯一? 也有什麼可以解決這個問題? – User14141111

+0

主鍵很複雜,它包含幾個字段:'logging_session','master_id','text_id'。我們可以說所有這些領域都形成了獨特的羣體。我們可以說只有第一個領域也是獨一無二的。所有其他,都不是唯一的。 – Devart

+0

你需要創建三個外鍵嗎?或者,可能需要創建一個包含三個相關字段的複雜外鍵?我認爲你應該多說一些你需要的數據庫模式。 – Devart

相關問題