SQL Serverでテーブル構造の表示方法

このQ&Aのポイント
  • SQL Serverでもテーブルの構造を表示する方法はありますか?
  • PostgreSQLと同様にSQL Serverでもテーブルの構造を表示できる方法はあるのでしょうか?
  • SQL Serverでテーブルの構造を表示するコマンドはありますか?
回答を見る
  • ベストアンサー

テーブル構造の表示

PostgreSQLの場合テーブルhogeの構造を表示するのに下記のように実行しますがSQL Serverでも同じ様なことはできないでしょうか? (コマンド実行) => \d hoge (実行結果) Table "public.hoge" Column | Type | Modifiers --------+---------+----------- class | integer | not null id | integer | not null name | text | Indexes: "hoge_pkey" PRIMARY KEY, btree ("class", id) ※表示された結果をコピペしてドキュメント等の作成に使いたいです。 宜しくお願い致します。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

SQL Serverのバージョンによって、ずいぶん変わるところです(特に2000までと2005以降)。 基本的にシステムビューを検索する方法しかありません。 1) INFORMATION_SCHEMAビューを使う(2000/2005以降とも)  以下のビューを検索します。コードは変換されているので比較的使いやすいですが、情報は限られます。  INFORMATION_SCHEMA.TABLES  INFORMATION_SCHEMA.TABLE_CONSTRAINTS  INFORMATION_SCHEMA.KEY_COLUMN_USAGE 2) オブジェクトカタログビューを使う  SQL Server 2005以降と、2000以前で違います。  (SQL Server 2005以降)  sys.tables テーブル情報  sys.columns カラム情報  sys.indexes インデックス・制約情報  sys.index_columns インデックス・制約のカラム情報  (SQL Server 2000まで)  sysobjects テーブル情報  syscolumns カラム情報  sysindexes インデックス・制約情報  sysindexkeys インデックス・制約のカラム情報  これらのビューを使うときには、以下の組み込み関数も利用して内部IDを取得することが多いです。  object_id('テーブル名') object_name(オブジェクトID)  type_name(ユーザタイプコード) これらの中で一番厄介なのが、インデックスのとり方です。INFORMATION_SCHEMAからは制約の情報は取れますが、 インデックスの情報はとれません。 従って、2)の方法になるのですが、あまり簡単に取れないです。  (SQL Server 2005以降) select object_name(ix.object_id), ix.name, ix.index_id, ix.type_desc, ic.index_column_id, c.name from sys.indexes ix inner join sys.index_columns ic on ic.object_id=ix.object_id and ic.index_id=ix.index_id inner join sys.columns c on c.object_id=ix.object_id and c.column_id=ic.column_id where ix.object_id=object_id('テーブル名')  (SQL Server 2000まで) select object_name(ix.id), ix.name, ix.indid, case when ix.indid=1 then 'CLUSTERED' else 'NONCLUSTERED' end, ic.colid, c.name, (ix.status & 1) from sysindexes ix inner join sysindexkeys ic on ic.id=ix.id and ic.indid=ix.indid inner join syscolumns c on c.id=ix.id and c.colid=ic.colid where ix.id=object_id('テーブル名') and (ix.status & 96)=0 私の認識が間違っていなければ、上記の通りです。

1percent
質問者

お礼

詳しく回答頂きありがとうございます。 こんなにややこしくなるとは思いませんでした。 ご教示頂いた内容を参考にして色々試してみたいと思います。

関連するQ&A

  • PostgreSQLのテーブル構造を取得したい

    現在PostgreSQLとPHP5を利用してアプリケーションを開発しております。 PHPにて現在すでに存在するPostgreSQLのテーブルの定義情報を取得するにはどうすればよろしいでしょうか。テーブルの定義情報は下記のようにSQLのCREATE文で取得したいと思っております。 CREATE TABLE favorite ( code serial NOT NULL, reg_date timestamp without time zone NOT NULL DEFAULT now(), update_date timestamp without time zone, title text, url text, u_id character varying(20) NOT NULL, enabled_flag smallint NOT NULL DEFAULT 1, CONSTRAINT web_favorite_pkey PRIMARY KEY (fv_code) ) 何卒よろしくお願いいたします。

  • create table時のdefaultにLAST_INSERT_ID()を使う

    いつもお世話になってます。 現在、postgreSQL→MySQLへの移行作業をしようとしています。 型が微妙に違う等の修正を手作業で行っているのですが、 postgreSQLの下記の型(default値)をMySQLでどう設定してよいかわからずに困っています。 ■postgreSQLのcreate文 CREATE TABLE test_tab ( id_i serial NOT NULL, parent_id integer DEFAULT currval('inquiry_tab_id_i_seq'::text) ) 下記のような感じでMySQLで出来るかなと思ったらうまく出来ませんでした。 ■試してみたMySQLのcreate文 CREATE TABLE test_tab ( id_i int primary key not null auto_increment, parent_id integer DEFAULT LAST_INSERT_ID() ) どう設定すれば、同じ設定のテーブルが作れるのか、どなたかご教授願えませんでしょうか。 よろしくお願いします。

  • postgresqlトリガー

    現在、保守対応を行っているシステムにて、 不明点があり、皆様にご助言を頂ければ幸いで御座います。 ■使用環境 "PostgreSQL 8.1.23 on i686-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51)" ■現状 update tbl_result_interview set {割愛} where {割愛} を実行すると mst_exam_resultというテーブルも更新がされます。 恐らくトリガーが引かれているのかと考えているのですが、 実態が確認出来ず苦慮しております。 =================================================== \d+ tbl_result_interview Column | Type | Modifiers | Description --------------+-----------------------------+-------------- {割愛} Indexes: "tbl_result_interview_pkey" PRIMARY KEY, btree (app_id) Foreign-key constraints: "tbl_result_interview_app_id_fkey" FOREIGN KEY (app_id) REFERENCES tbl_app_exam(app_id) Has OIDs: no =================================================== \d+ mst_exam_result Column | Type | Modifiers | Description --------+------------------------+-----------+----------------------------------------- {割愛} Indexes: "mst_exam_result_pkey" PRIMARY KEY, btree (code) Has OIDs: no =================================================== ちなみにpgadminで確認しても、トリガ関数(0)と出ており、 トリガはなさそうです。 関数は数個ありますがmst_exam_resultに更新処理を行う様な記述は見れません。 update tbl_result_interview set {割愛} where {割愛}により、 mst_exam_resultが更新されるのですが、 実態がわからず、確認項目でも構いませんので、 ご助言、ご指摘頂ければ幸いで御座います。 以上、引き続き宜しくお願い致します。

  • 他テーブルの集計結果を別テーブルのカラムに格納

    新規テーブル作成時にあるカラムに別のテーブルの集計結果を入れることはできるのでしょうか? 例えば、商品を定義したテーブルの中に、その商品が合計いくつ売れているかを集計するカラムを設置し、常に発注テーブルからその商品の合計発注数を引っ張って来て格納するイメージです。 テーブル作成時のみ集計するではなく、常に参照し動きがあれば数値が自動で変わるようになる方法を探しています。 いちいちselectで集計しなくても始めからカラムに集計値が入っていれば楽だなぁと思い質問しました。 どなたかわかる方いらっしゃいましたらよろしくお願いします。 商品テーブル CREATE TABLE product ( product_no SERIAL NOT NULL, (商品id) product_name VARCHAR(200) NOT NULL, (商品名) product_price VARCHAR(20) NOT NULL, (料金) product_sum INTEGER, (合計発注数)←ここ PRIMARY KEY(product_no) ); 発注テーブル CREATE TABLE order ( order_no SERIAL NOT NULL, (発注id) product_no INTEGER NOT NULL REFERENCES product(product_no) ON UPDATE CASCADE ON DELETE CASCADE,(商品id) order_num INTEGER NOT NULL,(その商品の発注数) order_date TIMESTAMP,(発注日) PRIMARY KEY(order_no) );

  • データベース:二つのテーブルの繋ぎ方

    私(あなた)が検査担当者だとします。 そして、測定担当者から CREATE TABLE measurement ( lot VARCHAR(10) NOT NULL, test_id INTEGER NOT NULL, data NUMERIC(17,7), PRIMARY KEY(lot, test_id) ); という、あるロットでのテスト番号に対する測定値データが送られてきたとします。 そして、設計担当者から CREATE TABLE spec ( test_name VARCHAR(10) NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_name) ); という、テスト項目名に対する上限・下限の仕様データが送られてきたとします。 ここで、テスト番号とテスト項目名は同じ数だけあって、お互いが一致するように同じ順番で並んでいるとします。 この二つのテーブルを使って、測定値が範囲内か範囲外かを調べるのが目的です。 この場合、どうやって二つのテーブルを繋ぐのが一般的ですか? 自分の考えだと、一旦、specテーブルにtest_idを加えて CREATE TABLE spec ( test_id INTEGER NOT NULL, test_name VARCHAR(10) NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_id, test_name) ); とするのですが、第二(第三?)正規化に基づいて 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(10), PRIMARY KEY(test_id) ); の二つに分けるのかな、と思っています。 正規化の観点から言うと、きっとこれが正しいのかなと思っています。 でも、元々、specテーブルにはテスト項目名が入っていたのでテスト項目名と上限・下限が一目で分かっていたのに、このように分けると、いちいちspecテーブルでテスト番号を確認してから、testテーブルでそのテスト番号に該当するテスト項目名を見つけなくてはならなくなってしまいます。クエリーでの検索もJOINをしなければならなくなって遅くなりませんか? 敢えて正規化しないでおく、なんて手段もありますか? こんな場合、皆さんならどうしますか? 「こうするように決められている」なのか、 「ああもできるし、こうもできるんですが、どっちでもいいですよ」なのか、 温度差みたいなものもできれば知りたいです。

  • PostgreSQLからMySQLへ変換

    現在ECサイトに追加カスタマイズ機能を導入したいと考えているのですが、 その際の使用コードが以下のようにPostgreSQLの記載となっており、 使用しているphpMyAdminにてSQLコードを入力するとエラーとなってしまいます。 ↓PostgreSQLコード CREATE TABLE dtb_bookmark ( bookmark_id serial NOT NULL, customer_id integer NOT NULL, product_id integer NOT NULL, memo text, create_date timestamp without time zone NOT NULL, update_date timestamp without time zone NOT NULL, del_flg integer ); ALTER TABLE ONLY dtb_bookmark ADD CONSTRAINT dtb_bookmark_pkey PRIMARY KEY (bookmark_id); COMMENT ON TABLE dtb_bookmark IS 'お気に入り情報'; エラーはtimestamp型とALTER以降の文で発生致します。 mysql文にて解釈させるにはどのように変更したらよろしいのでしょうか? 使用mysqlバージョンはMySQL 4.1.21です。 アドバイスなど頂けましたら幸いです。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • テーブル定義書作成時のIndex付加について

    基礎的なことで申し訳ございませんが、 お力添えよろしくお願いいたします。 CentOs 5 & PostgreSQL 8.4.9にてDB構築しております。 DB構築から、テーブル作成・項目追加・キー設定まで行いまして、 検索する際に、抽出件数が多く負荷のかかりそうなものに Indexを作成しようと考えております。 ■本題  1.Indexを作成する対象となる項目の、目安としてどのようなものが考えられるでしょうか。   ・キー対象の項目になっているもの   ・検索条件の対象となる項目なども当たるでしょうか  2.項目をまとめて一つのIndexにするメリット・デメリットはどのようなものでしょうか   3.テーブル結合したときのIndexの動作    例) 下記のようなテーブルがあった場合 tablea(データ50000件程度) hoge_id pkey1 hoge_no hoge_nm ... tableb(データ150000件程度) test_id pkey1 hoge_id pkey2 hoge_betu_kb ...     select t1.hoge_id, t1.hoge_nm, t2.hoge_betu_kb rom tablea as t1 leftjoin tableb as t2 on t1.hoge_id = t2.hoge_id where t1.hoge_id > '100' and t1.hoge_nm like 'あいう%'   このような場合のIndex作成は、 A. Create index idx_tablea_hoge_id ON tablea (hoge_id); B. Create index idx_tablea_hoge_id ON tablea (hoge_nm); C. Create index idx_tableb_hoge_id ON tableb (hoge_id); ←tableaで指定しているのでこれは不要?  4.A.B.C.のようなIndex作成した際のテーブル定義の書き方   テーブル定義書のフォーマットは定められており、お門違いな質問かとは存じてはおりますが、   テーブル定義にIndex定義を書く場合に、添付した画像のようなフォーマットの書き方が   よく理解できずお気づきの点などございましたら、ご指摘願えたら助かります。   (以前は、CSEツールなどで自動出力される定義書のような書き方をしていたもので・・・)         例)tablea IDX1 IDX2 IDX3 hoge_id 1 hoge_nm 2 このような書き方になるのかどうか?      IDX2, IDX3の項目とは?どのようなIndex定義をした際に書き込むことになるのかが判らず。。。      基礎から勉強しなおすべきとは存じておりますが。。。 現状の期間あまり時間がないことと、 DB構築を一人で行っており、このような内容を相談できるものがおりませんゆえ、 改めて、Index付加することを考えてみると、いまさら聞けないような内容かもしれませんが ちゃんと把握したうえで、テーブル構築したいと思いますので 今までの他の皆様の経験からのノウハウなども踏まえて、 ご教授いただけると大変助かります。

  • MySQL 2つのテーブルから情報を得る

    【質問内容】 出稿した求人広告に関する情報を収めたデータベース内に、以下の2つのテーブルがあります ※以下の文章を読むより、添付画像をご覧頂いたほうが分かりやすいと思いますが 1.出稿した求人広告の情報 テーブル名:ad_info id ID plan 広告プラン名 date_from DATE 広告開始日 2011-12-16 date_until DATE 広告終了日 2011-12-31 price 広告料金 2.求人サイトへのアクセス情報(広告掲載期間のみ毎日2時間おきに収集) テーブル名:daily_access id ID created_at DATETIME クローリングした日時 2011-12-16 17:00:00 pv プレビュー数 applicants 応募者数 occupation_ranking 職種別画面での自社の掲載順位 newly_ranking 新着企業画面での掲載順位 この2つのテーブルからad_infoの広告ごとに(その掲載期間ごとに)、daily_accessのデータを集計したいと思っています。しかしそのためのSQL文がうまく書けず、詰まっています。 どうか良い方法を教えていただけませんでしょうか。 あるいは「テーブル構造自体を変えたほうがいいよ」、「SQL文の書き方が良くないよ」など直接関係のないことでも大歓迎です。 よろしくお願いします。 【MySQLバージョン情報】 $ mysql --version mysql Ver 14.14 Distrib 5.5.16, for Linux (x86_64) using EditLine wrapper 【テーブル作成文】 CREATE TABLE `ad_info` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `plan` VARCHAR(30) DEFAULT NULL, `date_from` DATE DEFAULT NULL, `date_until` DATE DEFAULT NULL, `price` INTEGER DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `daily_access` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `created_at` DATETIME NOT NULL, `pv` INTEGER DEFAULT NULL, `applicants` INTEGER DEFAULT NULL, `occupation_ranking` INTEGER DEFAULT NULL, `newly_ranking` INTEGER DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    • ベストアンサー
    • MySQL
  • テーブルの自動キー再割り当て

    以下sqlでテーブルhogeを作成し、idを自動キーにしています。 CREATE TABLE `hoge` ( `id` INT NOT NULL AUTO_INCREMENT, ........(省略).......... PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=sjis; このテーブルのレコード番号4を削除するとテーブルのidは 1,2,3,5(最終)になり, 新しいデータを追加(INSERT)するとidは 1,2,3,5,6(最終)とid番号4が欠番になります。 テーブルのidを1,2,3,4,5と続き番号に再割り当てして、新しいレコードがid番号6の挿入されるようにするにはどのようにすればよいでしょうか? sql文をご教示い頂きたくよろしくお願いします。

  • AUTO_INCREMENTのあるテーブルにinsertできません(長文)

    mysql5.0.27(RedhatLinux 9)です。 属性のひとつがAUTO_INCREMENTになっているテーブルhogeに、データをinsertしたいのですが、「コラムの数が合致しない」というエラーで、insertできません。 Webをいろいろ漁って、AUTO_INCREMENTの属性は明示的に指定しないようだと理解しました。冗長で申し訳ないのですが、エラーが出た状態のものを、そのまま掲載させていただきます(テーブル名や属性名のみ変更しました)。 状態をまとめると、以下のようになります。 ・下記のテーブル定義で、テーブルは普通にcreateできた。 ・descで確認しても、ちゃんとテーブルはできているよう。 ・下記のinsert文で、その下のエラーメッセージが出て、データを登録できない。 ・どうみても、コラム数は合っている(と思う)。 ・下記のテーブル定義の属性数を適当に減らす(id, item1, item4, item6くらいにする)と、エラーが出ずデータがちゃんとinsertできる。 私はなにか、とんてもない勘違いをしているのでしょうか?かなりの時間試行錯誤しているのですが、一向にわかりません。。。 ===== テーブル定義 ===== CREATE TABLE hoge ( id MEDIUMINT UNSIGNED AUTO_INCREMENT NOT NULL, item1 VARCHAR (64) NOT NULL, item2 VARCHAR (64) NOT NULL, item3 VARCHAR (32) NOT NULL, item4 VARCHAR (64), item5 VARCHAR (64), item6 VARCHAR (16) NOT NULL, CONSTRAINT PK_HOGE PRIMARY KEY (id) ) type=innodb; CREATE INDEX IDX_HOGE_1 ON hoge(item1); CREATE INDEX IDX_HOGE_2 ON hoge(item2); CREATE INDEX IDX_HOGE_3 ON hoge(item3); CREATE INDEX IDX_HOGE_4 ON hoge(item4); CREATE INDEX IDX_HOGE_5 ON hoge(item6); ===== descの出力 ===== +---------------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+-----------------------+------+-----+---------+----------------+ | id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment | | item1 | varchar(64) | NO | MUL | | | | item2 | varchar(64) | NO | MUL | | | | item3 | varchar(32) | NO | MUL | | | | item4 | varchar(64) | YES | MUL | NULL | | | item5 | varchar(64) | YES | | NULL | | | item6 | varchar(16) | NO | MUL | | | +---------------------+-----------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) ===== insert文 ===== insert into hoge (item1, item2, item3, item4, item5, item6) values ( 'data1','data2', 'data3', 'data4', 'data5', 'data6'); ===== エラーメッセージ ===== ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1 長文大変申し訳ありません。よろしくお願いします。