PHPでPostgreSQLを使う場合の外部参照のメリットとは?
- PHPでPostgreSQLを使う際、外部参照の有無によるメリットはあるのか疑問です。
- 外部参照を使用することで、データベースの整合性を維持しやすくなります。
- しかし、テーブル結合を行う際にはどちらの方法を選んでも同じような使い方になり、メリットがあるかは疑問です。
- ベストアンサー
PHPでPostgreSQLを使う場合
外部参照はつけてもつけなくても同じでしょうか? そのメリットは無いのでしょうか? 例えば create table num_tbl { no int4 primary key, str text }; create table cont_tbl { no int4 references num_tbl(no), cont text }; の場合 references num_tbl(no) をつけることによってPHPのコーディングにメリットはあるでしょうか? どちらにしても select num_tbl.str,cont_tbl.cont from num_tbl,cont_tbl where cont_tbl.no=num_tbl.no; のような使い方になり何かメリットがあるようには思えないのですが
- guuman
- お礼率86% (1043/1206)
- PostgreSQL
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
外部キーは、参照整合性を表現するためのものであり、データベースのモデリング時に考えるべきものです。 とくにPHPのコーディングに応じて使うものでないので、その際のメリット/デメリットを考えるのは、ちょっと難しいかと。 参照整合性の意味を知っての上での質問という事であれば、update/delte cascadeが使えれば、SQL文を短くできる、とか。
関連するQ&A
- 表の結合と並べ替え
次のようなテーブル構成で、 CREATE TABLE tbl1 ( id int PRIMARY KEY AUTO_INCREMENT ) ENGINE=InnoDB; CREATE TABLE tbl2 ( id int PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) ) ENGINE=InnoDB; CREATE TABLE tbl1_tbl2 ( id int PRIMARY KEY AUTO_INCREMENT, tbl1_id int, tbl2_id int, FOREIGN KEY(tbl1_id) REFERENCES tbl1(id), FOREIGN KEY(tbl2_id) REFERENCES tbl2(id) ) ENGINE=InnoDB; CREATE TABLE tbl3 ( id INT PRIMARY KEY AUTO_INCREMENT, tbl1_id int, created datetime, FOREIGN KEY(tbl1_id) REFERENCES tbl1(id) ) ENGINE=InnoDB; [tbl1] id 1 2 3 [tbl2] id name 1 a 2 b [tbl1_tbl2] id tbl1_id tbl2_id 1 1 1 2 1 2 3 1 2 4 2 1 5 3 1 6 3 2 [tbl3] id tbl1_id created 1 1 2011-10-17 01:51:39 2 1 2011-10-17 02:51:39 3 3 2000-10-17 01:51:39 ここから次のような「tbl1のid」「tbl2の個数」「tbl3の最新のcreated」を基準とした (下の例は「tbl1のid」を昇順にした結果です) それぞれの並べ替た結果を得たいのですが、どのようなSQL文を記述すれば良いのでしょうか? [tbl1のid] [tbl2のnameのリスト] [tbl3の最新のcreated] 1 a,b,b 2011-10-17 02:51:39 2 a 3 a,b 2000-10-17 01:51:39
- ベストアンサー
- MySQL
- XPにPHP5とPostgreSQL8を入れて
コマンドラインで create table tbl_ken(i_ken int4,ken text); insert into tbl_ken values(1,'北海道'); ・・・・・・・・・・・・・ ・・・・・・・・・・・・・ insert into tbl_ken values(47,'沖縄'); としテーブルを作っておき <?php $x='北海道'; $con=pg_connect(・・・・・・); $rs=pg_query($con,'select * from ken where ken="'.$x.'" order by i_ken'; ?> とすると文字化けしているようでpg_queryの部分でエラーになります どうしたら文字化けしないようにできるでしょうか?
- ベストアンサー
- PHP
- SJISでPHP5+POSTGRESQL8
を使うとだめな場合があります。 調べてみると、 漢字文字列の配列を使った場合です。 pg_query("create table tbl(ken text[])"); pg_query("insert into tbl values('{大阪府,宮崎県}'); や pg_query("create table tbl(ken text[])"); pg_query("insert into tbl values('{\"大阪府\",\"宮崎県\"}'); です。 「府」、「宮」のSJIS下位コードが'{'と同じであるのが原因のようです。 他に「本」、「マ」、「笠」がつく漢字もだめです。 「本」の下位コードは'{'と同じで「マ」、「笠」の下位コードは'}'と同じです。 バージョンや環境によってはうまくいくようですが、 今の環境で積極的に対処する方法はあるでしょうか?
- ベストアンサー
- PHP
- 親子関係があるテーブル内での検索
親のidを保持するテーブルです。 CREATE TABLE `tbl` ( `id` int PRIMARY KEY, `parent_id` int, FOREIGN KEY(`parent_id`) REFERENCES `tbl`(`id`) ) ENGINE=InnoDB; このテーブルで「parent_idがNULLで、かつ、子を持たない(親というか子でもないというか)行」 を検索したいのですが、どのようなSQLを記述すれば良いのでしょうか?
- ベストアンサー
- MySQL
- php mysql で WHERE句内に変数を入れる方法を教えてください。
php初心者です。 お世話にになります。 id content 1 テキスト1 2 テキスト2 3 テキスト3 4 テキスト4 5 テキスト5 上記のようなデータベースです。 下記の文で5行目のテキストを抽出する事は出来ています。 $query = 'SELECT * FROM tbl_batsu WHERE id = 5'; ランダム整数を生成し、5つの中から一つランダムにデータを抽出したいと考えています。 $num = rand(1, 5); $query = 'SELECT * FROM tbl_batsu WHERE id = $num'; 上記ですとエラーが出てしまいます。 Query failed: Unknown column '$num' in 'where clause' そんなカラムはありませんという意味だとは思いますが・・・ 初心者なもので的外れな質問になっているかも知れませんが、解決策が分かる方は是非ご教授頂ければありがたいです。 よろしくお願いします。
- 締切済み
- PHP
- FOREIGN KEYの追加について。
FOREIGN KEYの追加について。 MySQL5.1.37 CREATE TABLE `goods` ( `id` int NOT NULL AUTO_INCREMENT, `num` int NOT NULL DEFAULT '1', PRIMARY KEY (`id`), index (`num`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `sales` ( `id` int NOT NULL AUTO_INCREMENT, `num` int NOT NULL DEFAULT '1', PRIMARY KEY (`id`), index (`num`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 上記のようなテーブルを作り、salesテーブルにCSVファイルからデータをインポートしたのち、FOREIGN KEYを子テーブルに追加したいのですが、下記のようなエラーになります。 ALTER TABLE `sales` ADD FOREIGN KEY ( `num` ) REFERENCES `test`.`goods` ( `num` ) ON UPDATE CASCADE ; MySQLのメッセージ: ドキュメント #1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`#sql-561_cf`, CONSTRAINT `#sql-561_cf_ibfk_1` FOREIGN KEY (`num`) REFERENCES `goods` (`num`) ON UPDATE CASCADE) データをインポートしたのちにFOREIGN KEYを追加するにはどのようにしたらいいのでしょうか?
- 締切済み
- MySQL
- 複数のindexについて
CREATE TABLE `test` ( `id` INT(8) , `num` INT(8) , 他多数 (省略) ) このようなテーブルがある場合、以下の2種類のインデックスのつけ方にどのような違いがあるのでしょうか? phpmyadminで確認すると、(1)はインデックスが合体しており、(2)はインデックスが個別に分かれています。 (1) ALTER TABLE `test` ADD INDEX ( `id` , `num` ) (2) ALTER TABLE `test` ADD INDEX ( `id` ) ALTER TABLE `test` ADD INDEX ( `num` ) ちなみに、以下のようなSELECT文を用いる場合には、どちらのインデックスが適していますか? SELECT * FROM test WHERE id='●' and num > '△' ( mysql5,MyISAM )
- ベストアンサー
- MySQL
- PostgreSQL8.4 配列型 集計
次のような構造テーブルがあったとします。 create table sample_tbl ( no numeric(7) primary key, val numeric[] not null ) ※val列は 配列型。 テーブルの中身は次のような状態 no val ------- ---------------- 1 {1,2,5} 2 {1,3,4,5} 3 {2} 4 {1,5} 5 {1,2,3,4,5} 6 {1,5} 最終的に "val列" の中身の数値ごとの件数を知りたいです。 <欲しい結果> 1 → 5件 2 → 3件 3 → 2件 4 → 2件 5 → 5件 SQLのみを用いたできるだけ単純(一時テーブルなどを使わずに) 且つ高速な方法を探しております。 何か良い方法はありますでしょうか・・? よろしくお願いいたします。
- ベストアンサー
- PostgreSQL
- oracleのUSER_TABLESのNUM_ROWSって?
USER_TABLESのNUM_ROWについて教えてください。 リファレンスマニュアルを見るとNUM_ROWは表内の行数をあらわすようです。 実行してざっと見てみるとCOUNT(*)で件数を取ったのと同じ値になるケースが多いですが、 (NULL)のケースもあります。 違う数値の場合もあります。 そのNULLの表はデータ0件なのかと思ったら、しっかりと結構なデータ量があったりします。 NUM_ROWは表内の行数=レコード数かと思ったのですがどうも違うようです。 USER_TABLESのNUM_ROWとは何でしょうか? <イメージ> SELECT TABLE_NAME, NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = 'TBL1' TABLE_NAME NUM_ROWS ---------- -------- TBL1 (NULL) TBL2 35 SELECT COUNT(*) FROM TBL1 count(*) -------- 980 SELECT COUNT(*) FROM TBL2 count(*) -------- 35
- ベストアンサー
- Oracle
- MySqlでのデータソートについて
MySqlバージョン:5.1.61で、下記のSQLを実行すると、 1件しかデータが無いにも関わらず、EXPLAINの結果で 「Extra: Using where; Using filesort」が発生します。 ---------------- CREATE TABLE IF NOT EXISTS tbl ( user int(11) NOT NULL, item int(11) NOT NULL, prm1 int(11) NOT NULL, prm2 int(11) NOT NULL, prm3 int(11) NOT NULL, PRIMARY KEY (user,item) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO tbl (user,item,prm1,prm2,prm3) VALUES (1,1,10,10,10); EXPLAIN SELECT * FROM tbl WHERE user=1 ORDER BY prm1; EXPLAIN SELECT * FROM tbl WHERE user=1 ORDER BY prm2; EXPLAIN SELECT * FROM tbl WHERE user=1 ORDER BY prm3; ---------------- ORDER BY句で使用する項目(prm[n])は10項目以上になりますので 10件を超える複合インデックスを張る事は避けたいと考えております。 また、tbl全体のデータは1億件、1userあたり100~200件を想定しています。 複合インデックスを使用せず「Using filesort」を 発生させなくする事はできるのでしょうか?
- ベストアンサー
- MySQL
お礼
ありがとうございます cascadeのときに違いが出てくるのですね