線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5132
推到 Plurk!
推到 Facebook!

請問怎樣後加foreign key在MySql ?

答題得分者是:yubad2000
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-09 04:38:21 IP:218.254.xxx.xxx 訂閱
雖然找到了以下資料,但跟著做都不行,仍然可以Del master的資料,當在detail中還有參考master的資料時。
請問在Mysql加foreign key constrain在已有的table中t要怎樣
做?
(需要的是後加foreign key而不是在create table 時設定foreign key,謝謝)
----------------
CREATE TABLE parts (
... 字段定義 ...,
model VARCHAR(20) NOT NULL,
... 字段定義 ...
);

接下來是 pc 表:

CREATE TABLE pc (
... 字段定義 ...,
cpumodel VARCHAR(20) NOT NULL,
... 字段定義 ...
};

設置索引

若要設置外鍵,在參照表 (referencing table,即pc表) 和被參照表 (referenced table,即parts表) 中,相對應的兩個字段必須都設置索引 (index)。

對parts表:

ALTER TABLE parts ADD INDEX idx_model (model);
這句話的意思是,為 parts 表增加一個索引,索引建立在 model 字段上,給這個索引起個名字叫idx_model。

對pc表也類似:

ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);

事實上這兩個索引可以在創建表的時候就設置。這裡只是為了突出其必要性。

定義外鍵

下面為兩張表之間建立前面所述的那種「約束」。因為pc的CPU型號必須參照parts表中的相應型號,所以我們將pc表的cpumodel字段設置為「外鍵」(FOREIGN KEY),即這個鍵的參照值來自於其他表。

ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model);
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
編輯記錄
chkkevin 重新編輯於 2008-03-09 04:42:48, 註解 無‧
yubad2000
中階會員


發表:0
回覆:44
積分:78
註冊:2007-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-09 12:30:24 IP:66.171.xxx.xxx 未訂閱
http://dev.mysql.com/doc/refman/5.0/en/alter-table.html

"The FOREIGN KEY and REFERENCES clauses are supported by the InnoDB storage engine, which implements ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...). See Section 13.2.6.4, “FOREIGN KEY Constraints”. For other storage engines, the clauses are parsed but ignored. The CHECK clause is parsed but ignored by all storage engines. See Section 12.1.5, “CREATE TABLE Syntax”. The reason for accepting but ignoring syntax clauses is for compatibility, to make it easier to port code from other SQL servers, and to run applications that create tables with references. See Section 1.8.5, “MySQL Differences from Standard SQL”.

Important
The inline REFERENCES specifications where the references are defined as part of the column specification are silently ignored by InnoDB. InnoDB only accepts REFERENCES clauses defined as part of a separate FOREIGN KEY specification.

InnoDB supports the use of ALTER TABLE to drop foreign keys:

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
For more information, see Section 13.2.6.4, “FOREIGN KEY Constraints”.

You cannot add a foreign key and drop a foreign key in separate clauses of a single ALTER TABLE statement. You must use separate statements. "

So, Check whether your Mysql is suppoerted by InnoDB storage engine.

===================引 用 chkkevin 文 章===================
雖然找到了以下資料,但跟著做都不行,仍然可以Del master的資料,當在detail中還有參考master的資料時。
請問在Mysql加foreign key constrain在已有的table中t要怎樣
做?
(需要的是後加foreign key而不是在create table 時設定foreign key,謝謝)
----------------
CREATE TABLE parts (
... 字段定義 ...,
model VARCHAR(20) NOT NULL,
... 字段定義 ...
);

接下來是 pc 表:

CREATE TABLE pc (
... 字段定義 ...,
cpumodel VARCHAR(20) NOT NULL,
... 字段定義 ...
};

設置索引

若要設置外鍵,在參照表 (referencing table,即pc表) 和被參照表 (referenced table,即parts表) 中,相對應的兩個字段必須都設置索引 (index)。

對parts表:

ALTER TABLE parts ADD INDEX idx_model (model);
這句話的意思是,為 parts 表增加一個索引,索引建立在 model 字段上,給這個索引起個名字叫idx_model。

對pc表也類似:

ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);

事實上這兩個索引可以在創建表的時候就設置。這裡只是為了突出其必要性。

定義外鍵

下面為兩張表之間建立前面所述的那種「約束」。因為pc的CPU型號必須參照parts表中的相應型號,所以我們將pc表的cpumodel字段設置為「外鍵」(FOREIGN KEY),即這個鍵的參照值來自於其他表。

ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model);
------
===波士頓夜未眠===
What a wonderful world!!
Jazz up the world with jazz!!
==================

When I am not programming...
you can find me here:
http://www.holy-war.de/EN/World3/bin/?advertiser=63190
編輯記錄
yubad2000 重新編輯於 2008-03-09 12:34:23, 註解 無‧
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-10 00:50:14 IP:218.254.xxx.xxx 訂閱
找到了中文版
---------------
如果您對一個MyISAM資料表使用ALTER
TABLE
,則所有非唯一索引會被建立到一個單獨的批裡(和REPAIR TABLE相同)。當您有許多索引時,這樣做可以使ALTER
TABLE
的速度更快。
這項功能可以明確激活。ALTER
TABLE...DISABLE KEYS
MySQL停止更新MyISAM資料表中的非唯一索引。然後使用ALTER
TABLE ... ENABLE KEYS
重新建立丟失的索引。進行此操作時,MySQL採用一種特殊的算法,比一個接一個地插入關鍵字要快很多。因此,在進行成批插入操作前先使關鍵字禁用可以大大地加快速度。使用ALTER
TABLE ... DISABLE KEYS
除了需要獲得以前提到的權限以外,還需要獲得INDEX權限。

·
Innodb儲存引擎支援FOREIGN
KEY
REFERENCES子句。Innodb儲存引擎執行ADD
[CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...)
。請參見15.2.6.4節,「FOREIGN
KEY約束」
。對於其它儲存引擎,這些子句會被分析,但是會被忽略。對於所有的儲存引擎,CHECK子句會被分析,但是會被忽略。請參見13.1.5節,「CREATE
TABLE語法」
。接受這些子句但又忽略子句的原因是為了提高相容性,以便更容易地從其它SQL伺服器中導入代碼,並運行應用程式,建立帶參考數據的資料表。請參見1.8.5節,「MySQL與標準SQL的差別」·
InnoDB支援使用ALTER
TABLE
來取消外部鍵:

· ALTER TABLE yourtablename DROP FOREIGN KEY fk_symbol;
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-10 01:24:41 IP:218.254.xxx.xxx 訂閱
謝謝指點:~
------------------------------------
終於知道是發生什麼事了,這是因為以下原因:~
FOREIGN KEY約束」。對於其它儲存引擎,這些子句會被分析,
但是會被忽略。對於所有的儲存引擎,CHECK子句會被分析,但是會被忽略。

用show create table 看之前的table crate statement :
CREATE TABLE `staff` (
......
......
....
PRIMARY KEY (`Staff_ID`,`Apply_date`),
KEY `s_dept_id_f` (`s_Dept_ID`),
KEY `s_dept_id_2` (`s_Dept_ID`) //set foreign on ENGINE=MyISAM
) ENGINE=MyISAM DEFAULT CHARSET=latin1

之後把ENGINE=MyISAM 改為ENGINE=InnoDB ,再用
ALTER TABLE staff_2 ADD CONSTRAINT f_dept FOREIGN KEY (s_dept_id) REFERENCES dept(dept_id)

show create table 看table create statement :
CREATE TABLE `staff` (
......
......
....
`App_form` varchar(10) default '',
KEY `f_dept` (`s_Dept_ID`),
CONSTRAINT `f_dept` FOREIGN KEY (`s_Dept_ID`) REFERENCES `dept` (`Dept_ID`) // The success statement after using add foreign key statement
) ENGINE=InnoDB DEFAULT CHARSET=latin1

只有InnoDB database engine 才支援alter table ... add / drop foreign key,其他的都會忽略這句statement.
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
編輯記錄
chkkevin 重新編輯於 2008-03-10 01:27:14, 註解 無‧
系統時間:2024-04-26 15:39:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!