2011-11-14 22 views
0

我正在執行以下命令行和/或mysql>提示。如何檢索外鍵和INSERT INTO表(MySQL/InnoDB)

我是DB的新手,注意到結構(教程)和定義(手冊)上有很多網站,但沒有關於實際示例。如果我有兩個表像這樣

CREATE TABLE IF NOT EXISTS owner 
(
    ID INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL UNIQUE, 
    PRIMARY KEY(ID) 
)ENGINE=InnoDB 


CREATE TABLE IF NOT EXISTS dog 
(
    ID INT NOT NULL AUTO_INCREMENT, 
    owner INT NOT NULL, 
    name VARCHAR(32) NOT NULL UNIQUE, 
    PRIMARY KEY(ID), 
    FOREIGN KEY (owner) REFERENCES owner(ID) 
)ENGINE=InnoDB 

如果我想要添加到表狗

INSERT INTO dog (owner, name) VALUES(get_owner_ID("Peter Griffin"), "Brian Griffin"); 

如何從名稱(「彼得·格里芬」)獲得神祕的所有者ID

+0

在執行'insert'之前,你必須首先選擇'Peter'id(取決於你的業務邏輯)。 – kan

+0

@ kan這是我迷路的地方。如果我從'owner'中選擇ID =「Peter Griffin」,則它返回一個表,而不是一個int。你如何獲得單一的價值,我在哪裏「存儲」它?我是否會將其用作複合語句 – puk

+0

只需執行兩個單獨的查詢 - 選擇並插入。並檢查是否只返回單個記錄(這意味着只有一個記錄具有name ='Peter')。 – kan

回答

2

您可以在插入到dog表中時運行子選擇,也可以創建自己的user defined function。用戶定義的函數比存儲過程具有優勢,因爲可以在插入過程中調用它。因此:

CREATE TABLE IF NOT EXISTS owner 
(
    ID INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL UNIQUE, 
    PRIMARY KEY(ID) 
)ENGINE=InnoDB; 

CREATE TABLE IF NOT EXISTS dog 
(
    ID INT NOT NULL AUTO_INCREMENT, 
    owner INT NOT NULL, 
    name VARCHAR(32) NOT NULL UNIQUE, 
    PRIMARY KEY(ID), 
    FOREIGN KEY (owner) REFERENCES owner(ID) 
)ENGINE=InnoDB; 

現在創建功能:

DELIMITER // 

DROP FUNCTION IF EXISTS get_owner_id// 

CREATE FUNCTION get_owner_id(i_owner_name varchar(32)) returns integer 
READS SQL DATA 
BEGIN 
declare v_owner_id int; 
select id into v_owner_id from owner where name = i_owner_name; 
return v_owner_id; 
END// 

DELIMITER ; 

insert into owner(name) values ('Peter Griffin'); 
insert into dog (owner,name) values (get_owner_id('Peter Griffin'),'Brian Griffin'); 

你將不得不考慮的處理這裏的主人不在owner表當然是存在的情況下的一種方法。也許在所有者表中有一個默認的「未知所有者」,如果沒有找到所有者,則從函數返回該默認的所有者?有點你...

+0

這是一個好主意,還是應該將所有者ID全部放在一起,並將名稱作爲主鍵?我不這樣做的唯一原因是因爲每個網站(包括這個網站)都說最好使用不相關的整數作爲主鍵。 – puk

+0

感謝您的好例子。 – puk

+0

啊。那麼你進入了「自然vs代理」主鍵的粘性世界。人們似乎在較少的問題上打仗!就我個人而言,我認爲你設計的表格(ID = PK,然後是名稱列上的唯一鍵)是一個好方法,你應該保持原樣。 「代理vs自然」的辯論太大,不適合這個評論框。 –