• 締切済み

DBで大文字小文字を区別せずINSERTする方法

データベースに関する質問です。 現在、学校でデータベースを使用したシステムを開発しています。 データベースは主にPostgreSQLを使用しています。 データをINSERTする際に大文字小文字を区別せず、 同じ文字列であるかどうかチェックする方法はありますか? たとえば、「abc123」と「aBc123」を同一とみなし INSERTできないようにしたいです。(主キーのため) システム側ではなく、できればデータベース側で判定を行いたいです。 宜しくお願い致します。

みんなの回答

回答No.3

PostgreSQL 8.4以降であれば、contribモジュールのcitext型を使うと、大文字小文字の区別のない主キーを定義できます。 【例】 test=# CREATE EXTENSION citext ; CREATE EXTENSION test=# CREATE TABLE ci_sample (key citext PRIMARY KEY, value text); CREATE TABLE test=# INSERT INTO ci_sample VALUES ('abc', 'foobar'); INSERT 0 1 test=# INSERT INTO ci_sample VALUES ('abC', 'foobar'); ERROR: duplicate key value violates unique constraint "ci_sample_pkey" DETAIL: Key (key)=(abC) already exists. PostgreSQLが9.1よりも古い場合は、CREATE EXTENSIONの代わりにSQLスクリプトを実行する必要があります。 【参考】 https://www.postgresql.jp/document/9.0/html/contrib.html

参考URL:
https://www.postgresql.jp/document/9.3/html/citext.html
回答No.2

データベース側では出来ないので、事前にlower(小文字化)関数かupper(大文字化)関数を使って、selectして無い事を確認してからinsertして下さい。

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.1

INSERT INTO INTO sample(id) VALUES ('aBc123') WHERE NOT EXISTS (SELECT * FROM sample WHERE id=lower('aBc123')); うろ覚えですが、lower()とEXISTSを使えばできるのではないかと思います。

関連するQ&A

  • ランダム文字列をDBにINSERT

    はじめまして。お世話になります。 LAMPでWEBシステムを作成しております。 ランダムな文字列をDBにINSERTする処理に関して質問させて頂きます。 条件: ・DBに入るランダムな文字列は重複不可。 ・ランダムな文字列は[a-zA-Z0-9]の10桁とする。 ・1度の処理で、ランダムの文字列は確実にINSERTさせる。 ・同時に多数の処理が走ることがある。 ・処理は速いに越したことない(DBの負荷も低めがよい) 環境: PHP 4.4.4 Mysql 5.0.33 使用ストレージエンジン:MyIsam 私が思いついたのが以下の2通りです。 (1) ランダム文字列が入るカラムをユニークキーとし、PHP側で作成されたランダム文字列をINSERT。 重複していたらエラーが返ってくるが、正常にINSERTされるまでPHP側でループ。 (2) 対象テーブルをロックし、PHP側で作成されたランダムの文字列をSELECT。 なければその文字列をINSERTし、テーブルロック解除 (1)はループが少し怖く、(2)はDBへの負荷がかかってしまいそうですが どちらがよいでしょうか? もしくは、他に何か方法があればご教授頂けるとありがたいです。 また、現在MyIsamを使用しておりますが、場合によってはストレージエンジンの変更も 考えておりますのでその点も考慮して頂けると幸いです。 ちなみに検索条件は、ランダムの文字列をキーに全てのデータを取得するくらいです。 そのテーブルは、カラム数15、レコード数1,000万の見込みです。 以上、長くなりましたがよろしくお願いします。

    • ベストアンサー
    • PHP
  • updateではinsertできない?

    フィールド名だけ決まったテーブルがあります。中は空っぽです。これに対してインサートすればデータが追加さえるのはわかります。 しかしアップデートをかけると、インサートと同じ結果を返すことができるでしょうか? 例えばテーブルABCがあります。列1はA、列2はBとあります。update ABC set A='1',B='2'とやればテーブルABCにデータが インサートされることになるでしょうか?手元にデータベースがあればよいのですが、ありませんので、このような質問お許しください。

  • MSDEでの大文字と小文字の区別について

    MSDEを使ってデータベースを構築しています。 基本的な質問なんですが、MSDEデータベースの中に格納したレコードについて大文字とか小文字を区別したいのですが、どうしたらいいのでしょうか? たとえば、「Picture」という項目(CHAR)が「ABC」という値のレコードをとってきたい場合、 Select * from 画像Table where Picture='ABC' というSQL文を発行すると、 「Picture」が「ABC」のレコードだけでなく「abc」のレコードもとってきてしまいます。 MSDEをインストールするときになにか、大文字小文字を区別できるようなオプションとかがあるんでしょうか? それともSQL文の書き方によってなにか対処方法があるんでしょうか? どなたか教えてください!!どうかよろしくお願いします。

  • JDBCでのinsertについて

    JDBCを使ってDBを扱います。 データベースはPostgresqlです。 Servlet+JSP+Beanで開発しているのですが、 以下のようなinsert処理をBeanで行っています。 String sql_insert = "INSERT INTO tal_ks(cd,kbn)" + " VALUES(" + vl1 + ",'" + vl2 + "')";System.out.println(sql_insert); System.out.println("SQL文発行"); int in = stmt.executeUpdate(sql_insert); System.out.println("(SQL文発行後"); ・ ・ ・ これを行うと、例外処理には流れず 実行したかのように見えるんですが、 実際はデータがはいっておりません。 このSQLと同じものをpsqlで直接実行すると insert できました。 これは、どういうことが原因なのでしょうか? 教えていただきたいです。

    • ベストアンサー
    • Java
  • DB INSERT 時の排他制御について

    初めて投稿するものです。 Java で DB 挿入処理 (会員登録) で悩んでおります。 DB はPostgreSQL8です。 挿入しようとしている会員テーブルは以下のようなレイアウトです。 会員テーブル  ・会員ID 主キー  ・ログインID NOT NULL(*)  ・メールアドレス NOT NULL(*)  ・会員名  ・... ※(*)にはユニーク制約を付けています。 会員IDはPostgreSQLのシーケンスで採番するため、 排他ロックは不要であると思っております。 ですが、ログインIDとメールアドレスは ユニークであるため、排他制御して重複 チェックしなければならないと思っています。 ユニーク制約を張っているため、例外が 発生して判定するというアイデアもあるとは 思いますが、例外で重複判定するのは できれば避けたいと思っております。 例外以外で安全に重複チェックする 場合、どのように排他制御するべきでしょうか? そもそも、排他制御せずに重複チェックを 安全にする方法はあるのでしょうか? ユーザーが多いサイトの場合、テーブルを ロックすると遅くなるような気がします。 ご教授よろしくお願いいたします。

  • アクセスDBファイルの複数テーブルの文字列を簡単に置換するには?

    アクセスのデータベースファイル内30テーブルほどの データがあります。 そのデータ内にあるひとつの文字(例えばABC)という 文字列があり,それを別の文字列(例:1000)に一括して 置き換えたいのですが,今のところ,一つ一つテーブルを 開いて置換コマンドを使って文字列を入力しています。 しかし、データベース内にあるABCと言う変数は計算に 使用するためその都度変更する必要があるため、とても面倒に感じています。 アクセスだけでこの作業はできるのでしょうか。 もし、できなければ外部プログラムでなにか良いものが あるでしょうか。ご教授ください。 よろしくお願いします。

  • 入力規則のリストで大文字小文字を区別させたい

    入力規則で元の値に直接リストを書き込んだ場合は、大文字小文字も区別されますよね。 元の値にセルの範囲や名前の定義で範囲を指定したものにした場合、大文字小文字が区別されずに困っております。 例えばシート2のA列をリストの範囲として「一覧」と名前の定義をしたとして、元の値に =一覧 と入れるとちゃんとリストとしては機能します。 ただ、入力規則を設定したセルに直接入力した場合、リストにない単語についてはきちんとエラーメッセージが出てはじかれますが、小文字大文字までは区別してくれません。 例えば、リストの中に「abc」という小文字だけの単語があったとして、セルに「Abc」と大文字を混ぜて直接入力してもそのまま書き込むことができてしまうのです。 「abc」だけを許可して「Abc」だの「aBC」だの大文字を混ぜた物はエラーとしてはじいて欲しいのですが、そういうことはできないのでしょうか? 入力規則だけで片付けたいのですが、VBAを絡めないと無理でしょうか?

  • OracleのLONG型への insert について

    お世話になります。 ASP + Oracle8.0.5で開発中のシステムがあるのですが、 ASP上のテキストエリアに文章を記述して、OracleのテーブルのLONG型のカラムに対して insertを行うとエラーが起こってしまいます。 正しくは、全角で2000文字までは入力できるのですが、 それを越えてしまうと、ORA-01461エラー(LONG値はLONG列にのみバインドできます)という エラーが起こってしまい、カラムに対してinsertすることができません。 テーブルを見直してみたのですが、ちゃんとLONG型に設定してありました。 LONG型のカラムにデータを登録する際、4000バイト以上の文字列は挿入できないでしょうか? でもLONG型って、2GBまで使用できるはずでしたよね? ご教授のほど、よろしくおねがいします。

  • まれにinsertエラーが発生する

    VB6からWindows版PostgreSQL8.2.4へ書き込みを行っています。 まれにinsertエラーが発生する為、困っています。(2日~7日に1回) エラー時のSQLログがあり、SQL文に間違いが無いことは確認ずみです。 エラー詳細を取っておらず詳細がわかりません。 (実際に現象を発生させようとしましたが、発生しません。) 追加するテーブル自体に主キーは設定していません。 データの書き込みは15秒に2レコード位なのですが、Update文の直後のinsert文がまれに失敗します。 とりあえず、トランザクション処理で回避していますが、PostgreSQLの設定値などの変更により、回避出来るのでしょうか。 また、この様な事はよくあることなのでしょうか。 説明が分かりづらく申し訳ありませんが、 宜しくお願いします。

  • dbの文字コード

    データベース(mysql)(pdo)にpasswaerd_hashでハッシュ化した文字列を格納しようとしたのですがおそらく文字コードが違うためにはじかれてしまいます。 マニュアルに 結果をデータベースに格納するときにはカラム幅を 60 文字以上にできるようなカラムを使うことをお勧めします (255 文字くらいが適切でしょう)。 と書かれているのですが、どれを使えばいいかわかりません。 どの文字コード(カラム側)を使えばいいですか? 接続はutf8mb4です。 ちなみにメールアドレス、英数字の20文字程度はutf8_general_ciです。 英数字に最適な文字コードを教えてください

    • ベストアンサー
    • MySQL