2011-09-24 24 views
5

SQLite3でone to manyを作成するには?私は、してください、SQL構文を知っている私を助けていないSQLite3でone to manyを作成するには?

Mans: 
_id name 
1 antony 
2 fred 

point 
_id date point 
1  23  77 
     24  99 

2  25  78 
     5  0 

: は、私は2つのテーブルを持っています。

+0

私は、2番目のテーブルがそうであることを疑う - これらのSQLテーブルまたは入力したいデータは? – Mark

+0

それは第二のテーブル –

答えて

3

次のように、このための構文は次のとおりです....

CREATE TABLE (MySecondTable) Foo INT FOREIGN KEY(Foo) REFERENCES MyFirstTable(PrimaryKeyField) ON DELETE CASCASDE ON UPDATE CASCASDE 

はここでしかv3.6.1 +

に取り組んでいますが何illin shrimp- iamkrillinで行くドキュメントhttp://sqlite.org/foreignkeys.html

+0

illinエビ - skrillin悪役:あなたは私の答えをチェックしましたか? –

11

ですSkrillin villain:

CREATE TABLE (points) points_id INT 
FOREIGN KEY(man_id) REFERENCES mans(PrimaryKeyField) 
ON DELETE CASCASDE ON UPDATE CASCASDE 

実際の例です。あなたのビジネスをあなたに紹介する人がいくつかいるとしましょう:あなたのスタッフ、あなたの友人、広告を行っている地元の企業など。入ってくる顧客を「参照」ビジネスといいます。各人物は1つの参照としてカウントされますが、リファラーは多くの照会を参照することがあります(たとえば、従業員は20人の新規顧客を参照し、従業員はリファラントであり、従業員は20人の照会を行いました)。だから、あなたは1つのリファラと20 referals(1対多)があります。今

CREATE TABLE referal(           
    referal_id INTEGER UNIQUE NOT NULL PRIMARY KEY,   //A customer can only be 1 referal. 
    referal_method TEXT,          //How were they refered? By phone? 
    referer_id INTEGER ,          //Who refered them? 
    FOREIGN KEY(referer_id) REFERENCES referer(referer_id)); //Trace more about referer. 

を、複数の人がreferalを参照することは可能であるが、私は唯一の補償することが標準的なビジネス慣行であることを考えます単一のリファラー。したがって、2人のリファラをリストする必要はありません。これは常に1対1または1対多の関係になります。したがって、それを1対多の表にする必要があります。私はカスケードのものにあまり堪能ではありませんが、私はそれがどのように適合するかを理解しようとします。

一見して、ON UPDATE CASCADE ON DELETE CASCADEは、私の答えには含まれていません。なぜなら、最後の参照を削除しても、参照元が削除されるべきではないからです。

a different exampleを見る:

CREATE TABLE all_candy 
    (candy_num SERIAL PRIMARY KEY, 
    candy_maker CHAR(25)); 

CREATE TABLE hard_candy 
    (candy_num INT, 
    candy_flavor CHAR(20), 
    FOREIGN KEY (candy_num) REFERENCES all_candy 
    ON DELETE CASCADE) 

あなたはhard_candyテーブルからハードキャンディを削除した場合、あなたはまた、ハードキャンディはキャンディのタイプであるため、all_candyテーブルから削除し、入力した場合はされています(例えば、中止されたキャンディーに変更された場合)、新しいINSERTコマンドを実行する必要があります。

sqlite3のON UPDATE CASCADEとON UPDATE DELETEのテストケースを実行しましたが、影響がないようです。おそらく、それらはsqlite3のデフォルトのdbエンジンでは動作しませんが、公式のSQLite Webサイトにある機能ISはa very descriptive, easy-to-follow example of ON UPDATE CASCADE by sqlite.orgです。読んであなたの考えを見てください。

これは私が私のテストケースのために使用されるスキーマです:

BEGIN TRANSACTION; 
CREATE TABLE candy(id integer primary key not null, name text, description text); 
INSERT INTO candy VALUES(1,'Laffy Taffy', 'Delicious, soft candy.'); 
INSERT INTO candy VALUES(2,'Pop Rocks', 'A candy that explodes in your mouth.'); 
COMMIT; 

BEGIN TRANSACTION; 
CREATE TABLE hard_candy(id integer primary key not null, name text, description text, foreign key(id,name,description) references hard_candy ON DELETE CASCADE ON UPDATE CASCADE); 
INSERT INTO hard_candy VALUES(2,'Pop Rocks', 'A candy that explodes in your mouth.'); 
COMMIT; 

は、どちらかのテーブルのID-2説明フィールド上のさまざまなアップデートを実行しました。

関連する問題