• ベストアンサー

ENUM列に列挙されていない値を挿入しようとしたときエラーにすることは

ENUM列に列挙されていない値を挿入しようとしたときエラーにすることはできますか 例えば、 ENUM('-10', '-5', 'なし', '+5', '+10') と定義した列に対して、'+2'を挿入しようとした場合はエラーにしたいです。 現状では、'+2'を挿入しようとすると、2番目の値と解釈され、'-5'が挿入されてしまうようです。 バッチ処理が、やっとこさ終わったと思いきや、データを確認してみてビックリですx_x

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

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

  • ベストアンサー
回答No.1

MySQLのバージョンを、少なくとも MySQL 4.0、4.1、5.0といったレベルまで書きましょう。 ENUMの仕様をマニュアルで確認しましたか? 値は文字とすべきで、数字や数字としてキャスト可能な値での仕様は、混乱の元なので使用すべきでないと、例まで記述されています。 http://dev.mysql.com/doc/refman/5.1/ja/enum.html 今回のケースでは、 (1)'+2'と一致する値は、ENUMで定義されていない (2)(1)により、'+2'がインデックス値として使用可能と解釈された ということです。 対策としては、ENUM値を数値と解釈されないように、英字や日本語などを使えば、別の値と解釈されることはなくなります。 また、ENUMで未定義であった場合に、無効な値として0を格納したり、エラーとしたり(SQLモードで指定)といったことも可能です。この辺は、MySQL 4.1か5.0くらいに標準設定に変更があったように記憶しています。 http://dev.mysql.com/doc/refman/5.1/ja/server-sql-mode.html

zyousuke
質問者

お礼

こんにちは なんか、いきなり説教された感じですが・・・ 要は無理ということですね・・・ さて、どうしよう・・・ インデックス値を使用禁止にするモードがあれば、いいのにな

その他の回答 (1)

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

>さて、どうしよう・・・ >インデックス値を使用禁止にするモードがあれば、いいのにな 正規化して外部キー制約してみてはどうでしょう?

zyousuke
質問者

お礼

こんにちは、 外部キー制約とは、別のテーブルに列挙値を登録して参照するようなやり方でしょうか。 よく分からなかったので、不本意ですがVARCHAR型にすることにしました;; これなら予期しない文字列が来た場合でも、そっくりそのまま登録されるので・・・ ENUM型は1バイトしか消費しないので魅力的だったのですが、まあ仕方ない

関連するQ&A

  • enum列挙子に使える文字列と使えない文字列

    enum Ok{A,A,月1,月1,_,?} enum Ng{1月,1月,→,!,☆} public class Main{public static void main(String[] args){ System.out.println("あああああ"); }}//終わり このJavaプログラムはエラーになります。何故ですか? 要するに、enumに使える列挙子の法則性に興味があります。「?」は通って「!」はエラーって、コンパイルを試みた後に結果を知ると、色々とムカつきます。 「!」は通って「?」はエラーだと嘘が書物に書いてあると、騙されます。 enumで使える列挙子(要素)のタイプが載ってるサイト、enumの列挙子に使うとエラーになってしまう例が載ってるサイトなどを紹介してくれるとありがたいです。 どんな文字列でもenumに使えて、何でもOKなら親切だと思うのに・・・

    • ベストアンサー
    • Java
  • enumの値から定義名を文字列化したい

    C++でenumの値を元に、定義した名前(Fruits_Appleとか)を文字列として取得したいのですが、何か良い方法はないでしょうか? switch文等で分岐させて...という方法もありますが、enumの定義数が多くなるとコードが複雑になるので、シンプルな方法をさがしています。 enum Fruits{ Fruits_Apple, Fruits_Orange, Fruits_End }; void printFruits(Fruits fruits) { // ここで引数fruitsの値に応じて"Fruits_Apple"とか"Fruits_Orange"とかを // 文字列に代入したい std::string fruitsName = "Fruits_Apple"; }

  • 列挙型って

    返り値に列挙型を指定して、関数を定義ってできますか? typedef enum{ Term, Insert, Append, Delete, Remove, Clear, Print } Menu; MENU SelectMenu(void); ってやるとエラーが返ってきます・・・・

  • javaによるenum型の扱い

    最近javaに親しんできたのですが、 Cとjavaにおける列挙型の扱いの違いに困っています。 javaにおけるenumはクラスであり、 各要素にメソッドを追加できることは分かったのですが…… 例えば、Cにおけるenumは確か、 typedef enum{EAST,SOUTH,WEST,NORTH} dirT; //定義 -------- (略) -------- dirT dir=EAST; //宣言・dirに要素EASTを格納 というようなことが出来たと思いますが、 javaはenumもクラスで、さらにnewでメモリ確保できないと聞きました。 つまり、このように列挙型の保持はできないということになるのでしょうか。 結局やりたいこととしては、このように「保持してある」列挙型に対して 条件分岐処理をしたいと考えています。 説明が上手くできず伝わりにくいかと思いますが、 どうか回答をお願いいたします。

    • ベストアンサー
    • Java
  • データセット上のテーブルに列の挿入が出来ない。

    VB2005で作成されたアプリの改修を行っております。 データセット上に定義されているテーブル(テーブルアダプタ定義有り)に 列を挿入する事になり、当該テーブルに列を挿入した所、「列を挿入出来ま せんでした」のエラーメッセージが表示され、挿入が出来ません。 データアダプタのSQLに列を挿入しても、同じメッセージが表示され、 挿入出来ません。 データアダプタが定義されていないテーブルには、何のエラーも無く列を 挿入出来ます。 何か足りない手順等が有るのでしょうか?

  • VB6 ClassにてEnum(列挙型)のうまい使い方

    へっぽこPGです。 今まで私の質問にご回答を頂いた方々、改めてお礼申し上げます。 最近VB6でActiveXDLLにて、DLLを作り始めました。 Classについて勉強を始めたばかりで、 実現できそうな機能と実現できない力量のギャップに苦労しています。 さて、いろいろと便利なDLLを作ってやるぞ!と意気込み、 ExeからDLLを参照してプロパティに値を設定する時に、 インテリセンスが出るようにしたく、ClassにEnum(列挙型)を使うやり方を見つけましたが・・・・。 その先困ってます。 VB6でデバッグをしているわけですが、 Class(Dll)とExeは別プロジェクトで生成しており、 Dllはバイナリ変換、デバッグはExeを実行するように設定済です。 これでActiveXDLLプロジェクトで「開始」をすると、Exeを実行してくれます。 Exeのプロジェクトから、 「開始」・ステップ実行して確認しましたが、 正常に動作しているようです。(記述した文がそれぞれ機能しているという意味で) ActiveXDLLプロジェクトから、 「開始」後、「停止」をして、Dllを上書きしようとすると、 「書込みできません。"~DllのPath~"」とMsgboxのBouttonのでいうvbMsgBoxStyle=vbCriticalの形式で、 Msgboxが表示されてしまいます。 どうやらExeがDLLを離していないのでしょうか? もちろん列挙型を設定していないDLLの場合ですと、上書きは可能です。 (他にも上書きできないパターンを見つけましたが、話が脱線するので割愛します。もしご存知でしたら、併せて教えて頂くと幸いです。) 困っている点としては、 1 デバッグする上で、Dll(書出)⇔Exe(開始)を繰り返したく、都度プロジェクトを閉じて、開いてDLL書出しするのは、非効率。 (DLLを書き出して、インターフェースを変えてしまえば、Exeはリコンパイルが必要なので、あんまり意味ないかも・・・とも) 2 読み取り専用プロパティを作って、Initializeで初期値を設定してしまう方法を考えたが、非常にかっこ悪いし、運用が大変。 3 1を我慢したとしても、作成したDLLはCOM+に登録して、WebサーバでASPから使用するつもりなので、DLLを離してくれないと、無駄なプロセス動き続けてしまう(?)→未テスト です。 いろいろとツッコミどころがあるかもしれませんが、 忌憚なくご意見下さい。 ---Class-(test_Class)---- '列挙宣言 Public Enum Chiiki Hokkaidou = 0 Aomori = 1 Akita = 2 End Enum 'プロパティ値を格納しておく変数 dim aaa as integer 'プロパティでEnum宣言した型を引数に指定します、 Public Property Get Shusshin() As Chiiki Shusshin = aaa End Property Public Property Let WindowState(ByVal NewValue As Chiki) aaa = NewValue End Property ---Class-End-------------------- ---Exe----------------- 'Classは参照設定にて '参照設定にしている理由としては、インテリセンスでロパティ・メソッド等を利用したいから。開発側の怠慢? Sub a 'Class宣言 Dim a_class as test_Class Set a_class = New test_Class 'プロパティ設定 ↓ = と打つと、Classの列挙で設定した値がプルダウン a_class.WindowState = Aomori 'プロパティ値表示(処理自体に意味無し) '「1」 と表示される Msgbox a_class.WindowState 'Class開放 Set a_class = nothing End sub ---Exe-End----

  • MAX()でENUMの内部番号が最大の文字列を取得

    MAX関数でmysql5のENUM列の内部番号が最大の値を取得したいのですが、文字列としての最大値が取得されてしまいます (x_x) enum( '牡2','牡3','牡4','牡5','牡6','牡7','牡8','牡9','牡10','牡11', '牝2','牝3','牝4','牝5','牝6','牝7','牝8','牝9', 'せん2','せん3','せん4','せん5','せん6','せん7','せん8','せん9','せん10' ) 例えば上の列の場合max関数は'牡9'を返しますが、どうにかして'せん10'を返すようにできないでしょうか・・・ ORDER BY DESCでは'せん10'が先頭になるので、max()も、どうにかすればできるのではと思った次第です

    • ベストアンサー
    • MySQL
  • Excelで二つの列を足して二番目に大きい値を求め

       A   B 1  2  10 2  9  32 3 11   1 4 11   3 5 45   8 上記のような列AとBがあったとします。AとBを足したマトリクスC={12、41、12、14、53}から二番目に大きい値を求めたいのですがやり方がわかりません。作業列などはつくらずVBAを使ったユーザー定義関数でやりたいのですがマトリクスの操作の仕方が分かりません。 よろしくお願いします。

  • ¥を含む文字列を挿入するとエラーとなります

    こんにちわ、よろしくお願いします。 OS:WindowsXP PostgreSQL:8.4.0 DBの文字コードはUTF8で構築しています。 【現象】 文字型のカラムに¥を含んだ文字列を挿入しようとすると以下のエラーになります。 WARNING: nonstandard use of escape in a string literal at character 331 SQL実行中に以下のエラーが発生しました。 ERROR: invalid byte sequence for encoding "UTF8": 0x00 エラーとなるのは例えば「C:\temp\hoge.txt」といった文字列です。 ただし、 「C:/temp/hoge.txt」 「C:\\temp\\hoge.txt」 とした場合は正常に挿入が出来ます。 8.1.11で同じプログラムを動かしているときは問題なく動作していました。 PostgreSQLを最新の8.4.0にバージョンアップしたところ上記のエラーが発生するようになりました。 エンコードの問題かと思い Postgresql.confのclient_encodingを色々設定してみましたが、解決しませんでした。 解決法が見当たらず困っています。 よろしくお願い致します。

  • C++独特のenum ?

    以下「プログラミング言語C++第3版 日本語版」 112ページから抜粋したものです。 ========================================================= enum flag {x=1, y=2, z=4, e=8}; // 範囲 0~15 flag f1 = 5;     // 型エラー:5はflag型の値ではない。 flag f2 = flag(5);  // ok:flag(5)はflag型のデータであり、             // flagの範囲に収まっている。 ========================================================= すごい初歩的そうな質問で申し訳ないのですが、 flag(5)とは何を意味しているのでしょうか? またこのような使い方はC++独特のものなのかCでも 当たり前のように使っているものなのか、できたら 教えてください。