2017-05-26 48 views
0

我不是很喜歡數據庫,我有以下問題。我正在使用MySQL如何在非PK領域處理這種與這種約束的關係?

我有2個表如下:

1)傳輸表:

CREATE TABLE transfers (
    id   BigInt NOT NULL AUTO_INCREMENT, 
    processed Char(1) NOT NULL, 
    providerpid VarChar(16) NOT NULL, 
    recipientpid VarChar(16) NOT NULL, 
    symbol  VarChar(128) NOT NULL, 
    `type`  VarChar(4) NOT NULL, 
    PRIMARY KEY (
     id 
) 
) ; 
ALTER TABLE transfers COMMENT = ''; 

2)附件1表:

CREATE TABLE annex1 (
    id  BigInt NOT NULL AUTO_INCREMENT, 
    symbol VarChar(128) NOT NULL, 
    doi VarChar(256), 
    PRIMARY KEY (
     id 
) 
) ; 
ALTER TABLE annex1 COMMENT = ''; 

我收到了以下要求,即似乎對我來說很奇怪(但也許我錯過了一些東西):

annex1.symbol值必須是一個值必須是一個外國 鍵引用transfers.symbol

所以,從我的理解是應該是因爲我不得不使用與這2個表的連接來獲取所有附件1記錄相關的轉讓記錄(這是一個一對多關係)。

但我不能annex1.symbol因爲transfers.symbol不是PK創建此作爲FK約束。

我錯過了什麼嗎?我能否以某種方式指定annex1.symbol必須包含可能的值transfers.symbol

回答

2

MySQL的需要外鍵索引和參考鍵,以便 外鍵檢查可以b e快速且不需要表掃描。在 引用表中,必須有一個索引,其中外鍵 列作爲第一列以相同順序列出。如果它不存在 ,則會在引用表上自動創建這樣一個 索引。如果您創建 另一個可用於強制執行外鍵約束的索引,則此索引可能稍後會自動丟棄。 index_name,如果給出,則按前面所述使用。

https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html

沒有必要精確地PK,但你需要指數transfers.symbol列,添加外鍵是這樣的:

create index ix on transfers(symbol); -- If this column have (and WILL IN FUTURE ALSO) unique values only, you can define this as UNIQUE index. 

ALTER TABLE annex1 ADD CONSTRAINT fk FOREIGN KEY (symbol) REFERENCES transfers(symbol); 
1

是的,你是正確的,你不能定義關係的非鍵列,但您可以在transfer表由composite primary key手段像

PRIMARY KEY (id, symbol) 

(OR)定義symbol的定義symbol作爲主鍵太UNIQUE KEY CONSTRAINT在這種情況下,也可以讓該列FK關係

+0

在什麼表?在轉賬表中? – AndreaNobili

+0

@AndreaNobili,請參閱編輯回答如果有幫助 – Rahul

+0

如果將它定義爲UNIQUE KEY CONSTRAINT會發生什麼?這意味着我可以有與附件1表格的單個記錄相關的轉移表的單個記錄?或者是什麼? – AndreaNobili