2014-09-22 123 views
0

我有三個主鍵和引用其他三個表 enter image description hereMySQL的多主鍵

下面的表更換爲表scheema:

CREATE TABLE IF NOT EXISTS training_matrix_reference(
    employee INT NOT NULL, 
    training_matrix INT NOT NULL, 
    training_record INT UNSIGNED NOT NULL, 
    PRIMARY KEY (employee, training_matrix,training_record), 
    FOREIGN KEY (employee) REFERENCES employees(id), 
    FOREIGN KEY (training_matrix) REFERENCES training_matrix_courses(id), 
    FOREIGN KEY (training_record) REFERENCES training_records(m_id) 
) 

我想製作一個REPLACE聲明更新training_record列或training_matrix列或同時列會創建一個新行(如果不存在),但我還需要檢查該員工是否屬於同一個公司。

這裏是我試過到目前爲止:

REPLACE INTO `training_matrix_reference` 
    (employee, training_matrix, training_record) (
    SELECT id, '5', '100' 
    FROM employees 
    WHERE id =22 
    AND company =64 
    ) 

所以我的理論是,這本應在表取代了第一排,更新training_record100但實際上它實際上創造了一個新行:

          22  |   5 |   100 

enter image description here

我的猜測是,這發生,因爲training_record是主鍵?

但我不確定刪除主鍵/引用是正確的方式,因爲此表用作其他查詢中的多對多表。

有效什麼,我試圖做的是:

REPLACE INTO `training_matrix_reference` 
    (employee, training_matrix, training_record) 
    VALUES 
    (22,33,18) 
    WHERE 
    employee = 22 
    and training_matrix = 5 
    and training_record = 2189 

但顯然一個REPLACE語句沒有where子句。

我也看看這些類似的問題:

MySQL REPLACE INTO on multiple keys?

mysql REPLACE query with multiple primary keys

但不幸的是MySQL是不是我的強項,我真的可以使用一些幫助。

我希望我解釋清楚的東西,感謝

回答

1

的training_matrix_reference表的主鍵是三列的組合。該表沒有多個主鍵,它有一個單個主鍵。

替換你的語法是相當於執行:

DELETE FROM training_matrix_reference 
    WHERE employee  = 22 
    AND training_matrix = 5 
    AND training_record = 100 
; 
INSERT INTO training_matrix_reference (employee, training_matrix, training_record) 
VALUES (22, 5, 100); 
; 

刪除動作不僅能消除在整個主鍵匹配的行。根據您提供的信息,我們希望將一行添加到表中。

您有問題嗎?

+0

謝謝,我想這個問題是,有沒有可能'設置training_record = 100,其中員工= 22和training_matrix = 5'就像使用'replace'在'insert'中一樣? – andrew 2014-09-22 18:43:41

+0

@andrew「不,用REPLACE是不可能的,因爲'training_record'是PRIMARY KEY約束的一部分,如果表的PRIMARY KEY只是兩列'(employee,training_matrix)',那麼你可以使用REPLACE'或'INSERT ... ON DUPLICATE KEY'語句將(22,5,2189)更改爲(22,5,100)(但這意味着對於給定的(僱員, training_matrix),例如(22,5)只會在表格中出現一次。 – spencer7593 2014-09-22 19:08:16

+0

感謝您的時間,我想我現在正開始圍繞它進行包圍+1 – andrew 2014-09-22 19:11:34

0

你應該讓(員工,training_matrix_reference) 之間的連接表或分配的,以免一個關係的答案

+0

您可以添加一些代碼來闡明您的意思? – 2014-09-22 20:17:09