• ベストアンサー

SHOW FIELDSについて

1.以下テーブルを作成しました  CREATE TABLE n_tables (  i integer NOT NULL); 2.作成したテーブルの構造について  SHOW FIELDS FROM number_tables;    <結果>   Field|Type  |Null |Key|Default|Extra  =============================  | i   | int(11) | NO |    | NULL|      | 質問:  1で、NOTNULLで i列を作成したのですが、Show fields を確認したときに  なぜ、DEFAULT列は NULLになっているのでしょうか。  NULL列がYES(NULL格納可能)で、DEFAULT値がNULLなら、DEFAULT列が  NULLなら納得できるのですが。  そういう仕様なのでしょうか。  MySQL Verは、5.1.33です。

  • MySQL
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

マニュアルによれば、not null条項が存在し defaultが存在しない時は、「defaultを決定できない」とあります。 show fields でのdefault 条件表示に際しては、「決定できない」を意味するものとしては、null以外に適当な表現がない ということでしょう。空文字列とも違うので。 明示的に not null default null とした場合も「default は存在しないから、必ずnull以外の値を指定せよ」という意味になります。 insert時にそのカラムを省略できないということです。

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/data-type-defaults.html
ShiftTail
質問者

お礼

なるほど。 意味が変わっているんですね。 参考になりました。 ありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

単にdefaultを指定していないという意味では? CREATE TABLE n_tables ( i integer NOT NULL DEFAULT 0); でつくれば、0と表示されます。

ShiftTail
質問者

お礼

情報ありがとうございます。 >単にdefaultを指定していないという意味では? mproさんの意見を読ませて頂いてから再度読ませて頂き 意味が分かりました。 ご教授ありがとうございました。

関連するQ&A

  • AccessのSQL文

    SQLで”Create Table”を用いてAccessのテーブルを作成しようとしたのですが テキスト型のフィールドのデフォルトがNotNullになってしまっているようで 「NULL許可」にできません。 どうやったらSQL文内でNULL許可が指定できるのでしょうか?

  • mySQLでのテーブル作成についての質問

    テーブル内の列で Field || Type || Null || Key || Default || Extra ID | int(6) | YES | UNI | NULL | auto_increment と言うテーブルを作成するにはどう記述したら良いのでしょうか? auto_incrementを指定した場合はフィールドにNULLを許可する事は出来ないのでしょうか?

  • NOTNULL制約について

    MYSQL ver4.0.20a 下記のようにNOTNULL制約を付けてテーブルを作成するのですが、 デフォルト値が勝手に設定されてしまいます。 CREATE TABLE TEST_01 ( NO int(8) NOT NULL auto_increment, STATUS int(1) NOT NULL, TOUROKUBI date NOT NULL, MEMO varchar(200) NOT NULL, PRIMARY KEY (NO) INT型だと 0 varchar型だと '' date型だと 0000-00-00 インサートの時に値がNULLの場合、SQLエラーを返してほしいのですが、 デフォルト値が設定されている為、登録されてしまいます。 本当はNOTNULL制約で、DBにチェックを任せたいのですが・・・ どなたかご存知の方、教えてください。 お願いします。

    • ベストアンサー
    • MySQL
  • 「Duplicate entry '1' for key 'PRIMARY'」というエラー。

    mysql> show fields from do; +-----------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | parent_id | int(11) | YES | | 0 | | | data_time | bigint(20) | YES | | NULL | | | text | text | YES | | NULL | | +-----------+------------+------+-----+---------+----------------+ というテーブルに、 insert into do values (1,1,1,'kkk'); などと、SQL文を実行すると、 Duplicate entry '1' for key 'PRIMARY' というエラーが出ます。 これはどういう意味のエラーなのでしょうか?

    • ベストアンサー
    • MySQL
  • NOT NULL と NOT NULL WITH DEFAULT

    CREATE TABLE でテーブルを作成するときに指定する、 「NOT NULL」 と 「NOT NULL WITH DEFAULT」 の違いを教えてください。 また、どういう時に使い分けるのかも教えてもらえるとうれしいです。 よろしくお願いします。

  • 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() ) どう設定すれば、同じ設定のテーブルが作れるのか、どなたかご教授願えませんでしょうか。 よろしくお願いします。

  • VBAでテーブル名とカラム名を動的に取得したい。

    お世話になります。 VBAでMySQLに接続をし、DB操作をするものを作成しています。 ・Windows7 ・エクセル2007 ・MySQL 5.1 ・ODBC そこで、以下のことをしたいと思っています。 (1)ある特定のデータベースの中にあるテーブル名を全取得 (2)そのテーブル名を変数または配列に格納 (3)そのテーブル名をキーに、今度はフィールド名を全取得 私が組んでみた該当のソースの部分は、   Dim aaa As New ADODB.Recordset   strSql = "show tables from testdb;"   Set aaa = con.Execute(strSql) 'conはADODB.connection Dim j As Integer For j = 1 To aaa.Fields.Count MsgBox aaa.Fields(j -1).name Next ・・・とここまで来ました。 show tables from databaseで、データベースにあるテーブルを取得して、 aaa.Fields(j -1).nameには「Tables_in_testdb」が入ります。 その次に、もう消してしまったので無いのですが、 msgbox aaa.Fields("Tables_in_testdb")?とやってみたところ、 データベースに入っている一つのテーブル名だけしか取得できませんでした。 ソースが回りくどい気がする+テーブル名が取得出来ず、 大分煮詰まっています。。。 何かもっとうまい書き方や構文(サンプル)ありましたら教えてください!!!

  • MySQLのデータベースのチェックはできませんか

    MySQLでcreate viewで作ったテーブルが削除できません。 show tablesで出てくるのですが、 drop table xxxxxするとテーブルが存在しないというエラーが出ます。 たぶんデータベースが壊れていると思うのですが、チェックして修復みたいなことはできませんでしょうか。

    • ベストアンサー
    • MySQL
  • データベース:主キーが文字列の場合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文字など少ない場合は 通し番号に置き換えてもきっと効果は薄いですよね? 何文字以上の文字列なら通し番号に置き換えたほうが速いですか? 皆さんはどのように決めていますか?

  • MySQL show create table ~と同じOracleでのSQL文

    Mysqlでテーブルを作成するステートメントを表示するSQL文 ” SHOW CREATE TABLE テーブル名”に該当する、oracleの SQL文ってありますか?