2011-11-14 17 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 

のように2つのテーブルを持っている場合そして、私はテーブルの犬に追加したい場合は、私は名前(「ピーター・グリフィン」)から不可解な所有者のIDを取得するにはどうすればよい

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

+0

「挿入」を行う前に、ピーターのIDをまず選択する必要があります(ビジネスロジックに依存します)。 – kan

+0

@kanそれは私が迷子になる場所です。私が '' name = "Peter Griffin"の所有者からIDを選択すると、intではなくテーブルが返されます。あなたはどのように単一の価値を得ていますか?それをどこに「保管」しますか?私はそれを複合ステートメントとして使用しますか? – puk

+0

2つの別々のクエリを実行してください。選択してから挿入してください。また、単一のレコードのみが返されるかどうかをチェックします(つまり、レコードがname = 'Peter'を1つしか持たないことを意味します)。 – kan

答えて

2

dogテーブルに挿入するときにサブ選択を実行するか、独自のuser defined functionを作成することができます。ユーザー定義関数は、挿入中に呼び出すことができるので、ここではストアード・プロシージャーよりも利点があります。したがって:あなたが所有者はもちろんのownerテーブルに存在しない場合に対処する方法を考えなければならないだろう

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'); 

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; 

今すぐ関数を作成します。所有者テーブルに既定の '不明な所有者'があり、所有者が見つからない場合はその関数から返されますか?あなたに至るま​​で...

+0

これはいいアイデアですか、それともオーナーのIDをまとめてプライマリキーとして使用するだけですか?すべてのウェブサイト(これを含む)は、無関係の整数を主キーとして使用することが最善であると言っているからです。 – puk

+0

そして素晴らしい例をありがとう。 – puk

+0

Ah。さて、あなたは、「自然対サロゲート」主キーの粘着性の世界に入っています。人々は小さな問題で戦争を戦うようです!個人的には、あなたが持っているテーブルデザイン(ID = PKと名前欄のユニークなキー)は良い方法だと思っています。 「サロゲート対ナチュラル」の議論は大きすぎてこのコメントボックスに収まりません。 –

関連する問題