2015-09-15 82 views
1
CREATE TABLE `myenv` (
    `userid` int(11) NOT NULL, 
    `envid` int(11) NOT NULL, 
    CONSTRAINT `fk` FOREIGN KEY (`envid``) REFERENCES `envtable` (`id`), 
    CONSTRAINT `fk` FOREIGN KEY (`userid``) REFERENCES `usertable` (`id`) 
) ENGINE=InnoDB 

上表已經有兩列有兩個外鍵。Mysql添加主鍵

現在我打算在下面的兩列上添加主鍵而不刪除外鍵。

見下面的新代碼:

CREATE TABLE `myenv` (
    `userid` int(11) NOT NULL, 
    `envid` int(11) NOT NULL, 
    PRIMARY KEY (userid`,envid`), 
    CONSTRAINT `fk` FOREIGN KEY (`envid``) REFERENCES `envtable` (`id`), 
    CONSTRAINT `fk` FOREIGN KEY (`userid``) REFERENCES `usertable` (`id`) 
) ENGINE=InnoDB 

這是正確的代碼?請讓我知道它應該工作與否?

+1

「這是正確的代碼?」...你爲什麼不簡單地嘗試它? – arkascha

+0

喲在一行中有兩個反引號,兩個外鍵引用不應該有相同的名稱。 –

+1

您可以直接從舊錶中更改它:ALTER TABLE'myenv' ADD PRIMARY KEY('userid','envid'); –

回答

1

其實這裏還有幾個問題:

首先你需要有你引用的兩個表:envtableusertable每個都具有ID作爲主鍵。

然後在表定義:

  • 你有誤放在一些backqoutes
  • 你命名的約束 相同。

工作代碼:

CREATE TABLE `myenv` (
    `userid` int(11) NOT NULL, 
    `envid` int(11) NOT NULL, 
    PRIMARY KEY (`userid`,`envid`), 
    CONSTRAINT `fk_myenv_envid` FOREIGN KEY (`envid`) REFERENCES `envtable` (`id`), 
    CONSTRAINT `fk_myenv_userid` FOREIGN KEY (`userid`) REFERENCES `usertable` (`id`) 
) ENGINE=InnoDB; 

這是一個好主意來命名下列公式的限制:

CONSTRAINT-NAME_TABLE-NAME_COLUMN-NAME 

這確保約束名是唯一的數據庫明智的(注意不是隻在同一個表中唯一)。