2011-11-28 123 views
1

我要說實話,我對主鍵和外鍵的工作方式有些朦朧。我被告知要在這裏設置我的數據庫,以便我有7個表格,一個用於組織,一個用於類別,服務和文化,一個用於組織,另一個用於分類,服務和文化其他。例如多個主/外鍵

以org_culture_xref表爲例。我有兩列,一列是org_id,與組織表的org_id列(主鍵)相同。另一個是cult_id,它與文化表的cult_id列(主鍵)相同。

我相信org_culture_xref表的兩列都是主鍵和外鍵。 但是,這似乎並沒有讓我對這兩列都有多個值。我希望能夠在組織和文化之間建立若干關係 - 因爲每個組織都可以與多種文化相關聯,每種文化都可以與多個組織相關聯。

如何確保我可以有兩個列的多個值?

回答

1

交叉引用表的主鍵將是兩列,這意味着兩個ID的組合必須是唯一的,但是您可以在任一列中重複個人ID。

下面是創建這樣一個表的語句:

CREATE TABLE `x` (
    `a_id` varchar(6) NOT NULL default '', 
    `b_id` varchar(6) NOT NULL default '', 
    PRIMARY KEY (`a_id`,`b_id`) 
) 

問題本身和交叉參考表方法很多一對多的關係,適用於大多數(如果不是全部)關係型數據庫,但由於我在10年左右沒有使用過mysql,我從here那裏得到了這個代碼,這個代碼似乎有關於mysql特定代碼的主題的詳細討論。

+0

每當我嘗試這樣做,它似乎取代了以前的ID。爲什麼會這樣? –

+0

@JakeSmith對不起 - 正如我所說的,我的mysql已經無法使用,所以我無法指導您正確創建超出create table語句的主鍵的詳細信息。 –

+0

@JakeSmith如果您已經創建了一個表,您不想使用該「CREATE TABLE」語句,因爲該語句不包含任何外鍵定義。如果我沒有記錯的話,你會想使用'ALTER TABLE'語句。 –

1

org_culture_xref的每一列都是外鍵:org_idorganization的外鍵,並且cult_idculture的外鍵。他們兩個在一起org_culture_xref的主鍵。

所以,東西沿着這些線路:

CREATE TABLE org_culture_xref 
(
    org_id NUMERIC(10) NOT NULL, 
    cult_id NUMERIC(10) NOT NULL, 
    PRIMARY KEY (org_id, cult_id), 
    FOREIGN KEY (org_id) REFERENCES organization (org_id), 
    FOREIGN KEY (cult_id) REFERENCES culture (cult_id) 
); 
+0

當我嘗試刪除我的上一張表並使用此SQL代碼時,它給了我一個關於無法創建表的錯誤消息。 –

+0

@JakeSmith:'org_id'和'cult_id' **具有與它們的引用相同的類型,如表org中的ord_id和cult中表中的cult_id一樣 –

+1

@JakeSmith:無法訪問你的數據庫,所以我需要對你沒有明確表達的東西做一些猜測。如果其中一項或多項猜測錯誤,您將收到錯誤消息。除非你給我更多的信息,否則我不能再幫忙。 (例如,爲什麼不告訴我錯誤信息是什麼?而不是寫出「關於不能創建表的錯誤消息」)。 – ruakh

3

什麼你所談論的是一個多到多關係。您正在使用交叉引用表的正確路徑。

查看外鍵和主鍵如何工作是很好的;每個表只能有一個主鍵,但可以有多個外鍵。但是,請注意,主鍵不必侷限於一列;您可以擁有跨越兩列,三列或更多列的主鍵。

這裏的解決方案是有兩個外鍵,一個用於每個列/表關係,另一個用於跨兩個表的主鍵。

下面是我一次使用的表格的示例,該表格以多對多的關係鏈接城市和縣。

mysql> show create table xref_cities_counties\G 
*************************** 1. row *************************** 
     Table: xref_cities_counties 
Create Table: CREATE TABLE `xref_cities_counties` (
    `city_id` int(10) unsigned NOT NULL, 
    `county_id` tinyint(3) unsigned NOT NULL, 
    PRIMARY KEY (`city_id`,`county_id`), 
    KEY `city_id` (`city_id`), 
    KEY `county_id` (`county_id`), 
    CONSTRAINT `fk_xrefcitiescounties_cityid` FOREIGN KEY (`city_id`) REFERENCES `florida_cities` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `fk_xrefcitiescounties_countyid` FOREIGN KEY (`county_id`) REFERENCES `florida_counties` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
1 row in set (0.00 sec) 

mysql> 
mysql> 
mysql> describe xref_cities_counties; 
+-----------+---------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+-----------+---------------------+------+-----+---------+-------+ 
| city_id | int(10) unsigned | NO | PRI |   |  | 
| county_id | tinyint(3) unsigned | NO | PRI |   |  | 
+-----------+---------------------+------+-----+---------+-------+ 
2 rows in set (0.00 sec) 

mysql> 

我會建議一些關於這個主題的額外閱讀。看起來你是一個好開始。