• 締切済み

カラム情報(主キー、データ型、桁数等)を取得するには

テーブルに格納されているカラム情報(カラム名、主キー、データ型、データの桁数)を取得したいと考えています。 主キー情報とそれに付随するカラム情報は現在下記のSQL文で取得しています。 SELECT C.TABLE_NAME , COL.COLUMN_NAME, C.CONSTRAINT_TYPE, COL2.DATA_TYPE, COL2.DATA_LENGTH FROM USER_CONSTRAINTS C, USER_CONS_COLUMNS COL, USER_TAB_COLUMNS COL2 WHERE C.TABLE_NAME = COL.TABLE_NAME AND C.CONSTRAINT_NAME = COL.CONSTRAINT_NAME AND C.TABLE_NAME = COL2.TABLE_NAME AND COL.COLUMN_NAME = COL2.COLUMN_NAME AND C.CONSTRAINT_TYPE = 'P' AND UPPER(C.TABLE_NAME) = UPPER('テーブル名') ORDER BY C.TABLE_NAME, COL.POSITION ここで、主キー以外のカラムに対しても同様にカラム情報を取得したいのですが、どのように取得すればよろしいでしょうか? ※カラム名、主キー有無、データ型、桁数 でカラム情報を取得できれば最も良いのですが、 主キー情報を除いた全体のカラム情報を取得する事ができれば、こちらの情報でも助かります 宜しくお願い致します。

  • Oracle
  • 回答数1
  • ありがとう数2

みんなの回答

回答No.1

全てのカラムは、USER_TAB_COLUMNSに存在するので、USER_TAB_COLUMNSに対して、 他表(USER_CONSTRAINTS,USER_CONS_COLUMNS)を外部結合するように変更すれば良いかと。

guccyonn
質問者

お礼

お礼が遅れてしまい申し訳ありません。 回答ありがとうございました。

関連するQ&A

  • カラム情報取得方法

    テーブル内のカラム情報を取得するにはどのようなSQLを作ればよいのでしょうか? 欲しい情報は「カラム名・主キーかどうか・データ型・桁数・NULLを許容かどうか」の5つとなります。 SQL Server は2005と2008を使用していて、どちらでも扱えるSQLがあると助かります。 どうぞ宜しくお願いいたします。

  • phpMyAdminの主キーについて

    phpMyAdminを用いて、MySQLを管理しております。 例えば、 ユーザーid  int ユーザーpw  int ユーザー名  varchar(20) 住所     varchar(30) 電話番号   varchar(10) 備考     text というように管理しております。 上記の場合ですと、主キーはユーザーidにのみ設定したいのですが、 int、varcharのデータ型にすると自動的に主キーが設定されてしまいます。(操作欄で主キーのアイコンがアクティブになる。) textですと主キーになりません。 主キーを解除しようとしますが、 #1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key というメッセージがでて解除できません。 主キーの設定はされていても、自分で主キーを設定したid以外は、同じ値を複数のレコードで保持できるので、問題はないのですが、これはどういう現象なのでしょうか?

    • ベストアンサー
    • MySQL
  • データがある場合のカラムの削除

    データがあるカラムを削除したいのですが、出来ません! drop column column_name だとデータ無しの場合しか通用しなくて・・・。 削除対象のカラムのデータだけを消そうかと、 delete from table_name where column_name=値; も考えたのですが、 where句で引っ掛かったレコードが全部消えてしまいます・・・。 1カラムだけ削除する方法を教えて下さい(><) 宜しくお願いします。

  • sqlservrのシステムテーブルから主キー判定

    sqlservrのシステムテーブルのから主キーの判定を行いたいです。 sysobjects(type='U')でテーブル情報があり、それに紐付くsyscolumnsの項目情報があるとします。 テーブル名,項目名 tbl1,item1 tbl1,item2 tbl1,item3 tbl2,item1 tbl2,item2 これは、 select obj.name as "テーブル名" , col.name as "項目名" from sysobjects obj left join syscolumns col on obj.id = col.id where obj.type = 'U' で取得できますが、 さらに、主キーの項目には○をつけたいです。 テーブル名,項目名,主キー tbl1,item1,○ tbl1,item2,○ tbl1,item3,null tbl2,item1,○ tbl2,item2,null sysindexkeysやsysindexesの情報を引っ掛ければなんとかなるかと思いましたが、何ともならずにGive UP状態です。 システムテーブルを結合して取得する方法はありますでしょうか?

  • 主キーは既に存在しています。と出てインストールできません

    DVDに入ったあるソフトをインストールしようしたら、 途中で以下のエラーが出てインストールできませんでした。 ALTER TABLE T010 ADD CONSTRAINT PK_T010 PRIMARY KEY(IDT010) 主キーは既に存在しています。 他の人たちは同じDVDからインストールできたのに私だけこのエラーがでてインストールできず困っています。 直し方が分かる方いらっしゃいましたら、よろしくお願いいたします。

  • データベース:主キーが文字列の場合IDを振るべき?

    テーブルの主キーが文字列の場合、 その主キーの文字列を通し番号に置き換えて、 その文字列は別テーブルに移したほうが検索が速いですか? 例えば、テーブルが CREATE TABLE spec ( test_name VARCHAR(40) NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_name) ); で、40文字という長いテスト項目名の場合、 CREATE TABLE spec ( test_id INTEGER NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_id) ); と CREATE TABLE test ( test_id INTEGER NOT NULL, test_name VARCHAR(40) NOT NULL, PRIMARY KEY(test_id) ); という二つのテーブルに分けたほうが検索は速くなりますか? (もちろん、結合する時間も含めてです。) もし速くなるとしても、文字数が3文字など少ない場合は 通し番号に置き換えてもきっと効果は薄いですよね? 何文字以上の文字列なら通し番号に置き換えたほうが速いですか? 皆さんはどのように決めていますか?

  • javaにてデータ取得

    JAVAカテゴリーで質問しようかこちらにしようか迷ったのですが。。。 あるテーブルを以下の様に内部結合しています。 select * from t_table a, t_table b where a.id=b.id and a.no=0 and b.no=1 この時、t_tableのあるカラムtestcolを取得したいとおもっております。 言語はjavaで、データベースはpostgreSQLです。 rs.getString("testcol"); rsはResultSetオブジェクトです。 これで、データは取得できるのですが、条件のt_tableの別名aのデータ が取得されます。別名bの方を取得したいと思い、単純に rs.getString("b.testcol"); 等としたら、「カラム名がありません」というエラーになりました。 getStringのパラメータとして、カラムインデックス(数値)も 指定できるので、それで行うと取得可能でした。 カラムインデックス指定ですと、プログラムのメンテナンス上支障をきたす ので、なんとか、カラム名の指定で行いたいと思っておりますが、 どうすればいいのでしょうか?

  • SQL MIN句

    テーブルには複数の主キーがあり、そのうちの3つの主キーを元に 最も古い日付の情報を取得したいです。 同じデータが複数あるので、副問い合わせ(=)でエラーになると思ったのですが エラーにならずにすべてのデータが取得されてしまいます。 テーブル id name sex date1 1 'A' '男' 20120101 1 'A' '男' 20120101 2 'A' '女' 20120102 select * from table where date1 = (select min(date1) from table where id = 1 and name = 'A' and sex='男'); 下記のような情報を取得するには、SQLとして間違えておりますでしょうか。 ↓ id name sex date1 1 'A' '男' 20120101 1 'A' '男' 20120101 お分かりの方、ご教授頂けませんでしょうか。 以上、よろしくお願い致します。

  • SQL構文でカラム名をハッシュのキーに

    PerlをDBIでMySQLに接続しています。 MySQLの“country”テーブルに“name_en”カラムがあり、これをハッシュのキーにして、 下記構文で“name_jp”カラムに文字列を挿入しようとしたのですが、 ----------------------------------------- $sth = $dbh -> prepare ("update country set name_jp = \'$name{name_en}\' where id between 1379 and 1396"); ----------------------------------------- 結果は何も入りませんでした。 カラム名をハッシュのキーにするには、どう書けばいいのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Perl
  • COL

    COL COMMENTS FORMAT A44 SELECT * FROM DICTIONARY WHERE LOWER(COMMENTS) LIKE 'constraint%'; とありますが、検索した結果、TABLE_NAME列とCOMMENTS列が取得されています。 COMMENTS列には'Constraint definition …'というデータが取得されていますが、LOWER関数を使っているのに先頭が大文字になっているのは、なぜでしょうか? また、COL COMMENTS FORMAT A44と指定してから、SELECT を行っていますが、この'COL COMMENTS …'は、DICTIONARY のCOMMENTS列を44バイトに変更しているのでしょうか? データディクショナリには、ALL~、USER~,DBA~があるとありますが、DICTIONARYもデータディクショナリでしょうか? ユーザがアクセス可能な情報を格納したものであり、データベース管理者でなくてもアクセス可能な情報なのでしょうか? 接頭語が付いていませんがALLが付いたようなものでしょうか?