• ベストアンサー

PostgreSQL : 多値従属性(第四正規化)のprimary key 設定

一つの項目の主キーを指定する際、 例えば day date primary key と指定しますよね。 2つの項目を1つとし、主キーを指定する記述の仕方がわかりません。 確かOracleでは,例えば (n_code,s_code)primari key でしたっけ??あまり自信がないですが、こんなような記述の仕方を していたような覚えがあります。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • misoka
  • ベストアンサー率35% (56/160)
回答No.1

たとえば... CREATE TABLE hoge ( n_code INTEGER, s_code INTEGER, PRIMARY KEY( n_code, s_code ) ); という感じです。

yuko1974
質問者

お礼

回答をありがとうございました。 これでばっちりでした。

関連するQ&A

  • Primary Key について

    PostgreSQLのPrimary Keyについて質問があります。 ---------------------------------- create table test_db ( id int8, name varchar(32), day date, constraint PK primary key( id, name)); ---------------------------------- 上記のようにtest_dbを作成しました。 データをinsertする際、 id:[1] name:[watanabe] day:[2003-05-29] id:[2] name:[watanabe] day:[2003-05-29] とするとデータが格納されてしまいます。 idとnameの両方が一致したデータは格納できないと 思うのですが、 id, name各々test_db内に対して一意なデータとして 扱いたいのですがどのようにすればいいでしょうか? [例] id:[1] name:[watanabe] day:[2003-05-29](格納済) (name:watanabeは存在するためエラー) id:[2] name:[watanabe] day:[2003-05-29] (id:1は存在するためエラー) id:[1] name:[simada] day:[2003-05-29] (正常格納) id:[2] name:[simada] day:[2003-05-29] --------------------------------------- わかりづらくて申し訳ありませんが、 宜しくお願いいたします。

  • 主キーに重複があるレコードの登録について

    ORACLEを使用していますが、 主キーに重複があるレコードの登録は可能でしょうか? ちなみにDDLには、「ONSTRAINT インデックス名 PRIMARY KEY」の構文を記述しています。 また、登録できないとすれば、どのようにDDLを修正すれば良いでしょうか?

  • 続oracleのプライマリ・キー名の変更について

    oracleのテーブル名を変更します。 運用上ネーミングルールとしてプライマリ・キー名はpk_テーブル名としていますので、 プライマリ・キー名もこの時に変更したいのですが、適切な手順を教えてください。 旧テーブル名:table_a 旧プライマリ・キー名:pk_table_a  ↓ ↓ ↓ 新テーブル名:table_b 新プライマリ・キー名:pk_table_b という質問をさせて頂きました。 回答を頂き、一旦納得した気がしたのですが、どうもうまくいきません。 下記を実行すると4のところでコケます。 既にオブジェクトが存在するというものです。 どうやら 2のところのプライマリキー名変更がうまくいっていないか pk_table_aがどこかにゴミとして残っているように思えます。 オブジェクトブラウザというツールで見てみると、 CONSTRAINTにpk_table_bが INDEXのところにpk_table_aが見えています。 手順がおかしいのか? コマンドが間違えているのか? それともプライマリキー名の変更はしない方が良いのか? ここら辺を教えてください。 --1.TABLE 作成 CREATE TABLE table_a ( ITM1 VARCHAR2(10) NOT NULL, ITM2 DATE, CONSTRAINT pk_table_a PRIMARY KEY (ITM1) USING INDEX ) / --2.プライマリキー名変更 ALTER TABLE table_a RENAME CONSTRAINT pk_table_a TO pk_table_b / --3.テーブル名変更 RENAME table_a TO table_b / --4.「1」と同じTABLE 作成 CREATE TABLE table_a ( ITM1 VARCHAR2(10) NOT NULL, ITM2 DATE, CONSTRAINT pk_table_a PRIMARY KEY (ITM1) USING INDEX ) /

  • FOREIGN KEYの書き方

    オラクル9iを使っています たとえば ☆MST_商品テーブル        ・商品コード  varchar2(10) 主キー  ・分類区分   varchar2(10)  ・商品名称   varchar2(30)  ・仕入先コード varchar2(10) ☆MST_仕入先テーブル  ・仕入先コード varchar2(10)主キー  ・仕入先名称  varchar2(30)    ・取引区分   varchar2(30) があったとして 商品テーブルの仕入先コードと仕入先テーブルの仕入先コードにFOREIGN KEYを使ってリレーションを張りたい場合どのようにSQL文は書いたらいいのでしょうか? ☆CREATE TABLE MST_仕入先    (仕入先コード varchar2(10) NOT NULL,     仕入先名称 varchar2(30), 取引区分 varchar2(30), ALTER TABLE MST_仕入先 ADD CONSTRAINT PMST_仕入先 PRIMARY KEY(仕入先コード); と CREATE TABLE MST_商品 (商品コード varchar2(10),     分類区分 varchar2(10)     商品名称 varchar2(30), 仕入先コード varchar2(10), ALTER TABLE MST_商品 ADD CONSTRAINT PMST_商品 PRIMARY KEY(商品コード); でテーブルと主キーを設定し ALTER TABLE MST_商品 ADD CONSTRAINT FMST_商品 FOREIGN KEY(仕入先コード) REFERENCES MST_仕入先(仕入先コード); ほかにもいろいろ試したのですが にっちもさっちもいかないのでよろしくお願いします。

  • primary(unique?) keyでwhereしてupdateできない

    mysql5.0を使っています。 IDという項目のPrimary Key、他は特別な設定をしていない項目が複数あります。これらの項目をupdateで更新する際(IDは更新しません、永久に固定です)、そのままでは当然全部の行がupdateされてしまうので条件指定が必要です。そこで更新対象が一意になるよう、whereを使ってIDを指定しようと思ったのですが、なぜかこれが実行されません。SQL文は以下のような感じです。 update my_db set a="a", b="b", c="c" where id="oshiete";(何も変わらない) 色々やって実験してみたところ、キーが一意になるような設定(Uniqueあるいは自動的にそうなるPrimary)をしているとうまくいきません。設定を外すとうまくいきますが、仕様上どうしてもIDは一意である必要があるのでその設定を外す訳にはいきません。しかしなぜかselect文では問題なく動作します。 select * from my_db where id="oshiete"; なぜこのケースでupdateを実行できないのでしょうか? どなたか解決法をご存知の方、どうかお助けください。 よろしくお願い致します。

  • Accessから主キーの無いOracleテーブルにVBAで主キー設定付のODBC接続するには

    Oracle7--------------- Access97 Workgroup Server Release 7.3.2.2.1 TABLE_A----------------ODBC接続(リンクテーブル)     項目1 項目2 項目3 項目4 項目1~項目4は 空白レコードがあり 主KEYが張れない ******************************************************************** 主キーの作成出来ないオラクルテーブルがあります。 Access97からODBC接続を作成する時は (1)マニュアルであれば   対象テーブルに主キーが無ければ 任意の10項目を仮の主キーとして設定出来ますが (2)VBA(自動?)で リンク張ると Dim tab01 As TableDef  Dim db01 As Database  Dim strTABname As String strTABname = TABLE名 Set db01 = CurrentDb Set tab01 = db01.CreateTableDef(UserName & "_" & strTABname, dbAttachSavePWD) tab01.SourceTableName = UserName & "." & strTABname tab01.CONNECT = "ODBC;DSN=****;UID=" & UserName & ";PWD=" & Password & ";ConnectString=con;" db01.TableDefs.Append tab01 主キー設定の無いODBC接続が出来て   データの更新などが出来なくなります。 VBAでも仮の主キー設定付きのODBC接続は  出来ないでしょうか?

  • PostgreSQLでの外部結合

    PostgreSQLでの開発をしております。 今まで、Oracle,SQLServerでしか開発経験がなく、外部結合のやりかたがピンときません。 Oracleでいう以下のSQLをPostgreで書く場合、どのように記載すればよいのでしょうか? SELECT m.no, c.value FROM main_table m, code_master c WHERE m.code = c.code(+) AND m.update_date > sysdate AND c.content_flg = "0"; main_tableのcodeがNullや、code_master.codeに対応する値がない場合でも、レコードを持ってくる。 ※Oracleなどは独自のやりかたを行っているので、Joinを使うやりかたのほうがSQLとしては正しいのですが・・・。

  • 主キーの位置

    こんにちわ。 MDBでテーブル設計するときに, 主キーとなる項目は,テーブルのどの位置に定義しても 影響はないのでしょうか? やはり先頭が一般的かと思われますが, 最後尾に定義すると何か不都合などあるでしょうか? なおORACLEではどうでしょうか? 教えてください。お願いします。

  • 外部結合と抽出条件の指定について

    皆様、ご教授願います。 初めてoracleを利用しているので、ほんとの初心者で 記述の方法がわかりません。 下記の記述でカウントの結果が異なります。 私の中では、同じ結果が得られると思うのですが どのような違いがあるのでしょうか??? -------------------パターン1------------------- SELECT  count(A.SO_CODE) FROM  URI_HEAD A,  KOKUB_FILE B WHERE  A.SO_CODE=B.SO_CODE(+) -------------------パターン2------------------- SELECT  count(A.SO_CODE) FROM  URI_HEAD A,  KOKUB_FILE B WHERE  A.SO_CODE=B.SO_CODE(+) AND  A.KYOTEN_CODE like '%' AND  B.TAN_CODE like '%' ORDER BY  A.SO_CODE asc 最終的には、パターン2のそれぞれの項目に 条件が入るのですが、テスト段階でまずは、あいまい検索に してみたのですが。。。 この記述に誤りがあるのでしょうか??? MSSQLやpostgresは使ったことがあるのですが oracleは初めてなので、SQL文の記述に誤りがあるのか、oracleを利用したときの記述に誤りがあるのか 判断がつかなくて、先に進めません。 教えてください。。。

  • 重複を許すキーの構文がわかりません。

    データベース自体はPostgreSQLを使っています。そして、アクセス2003を使って、テーブルリンクで閲覧しています。 あるフィールドに検索が早くなるようにキーを設けたいのですが、 重複を許すキーの構文がわかりません。 PRIMARY KEY, UNIQUEの設定はわかるのですが、 どのように記述すればよいのでしょうか? 以下、アクセスのプロパティです。 インデックス ●いいえ デフォルト、無指定 ●はい(重複あり)[***** ここの部分のSQLが知りたい *****] ALTER TABLE テーブル名 ADD ???????? (フィールド); ●はい(重複なし)UNIQUE もしくは値要求混みのPRIMARY KEY ALTER TABLE テーブル名 ADD UNIQUE (フィールド); ALTER TABLE テーブル名 ADD PRIMARY KEY (フィールド);