lastInfdexOf 関数の MySQL 実装例

lastInfdexOf 関数の MySQL 実装例

MySQL では lastIndexOf に似た関数を使用する必要がある場合もありますが、すぐに使用できる既製の関数は用意されていないため、自分で見つけ出す必要があります。

まず、MySQL は次の 3 つの機能を提供します。

instr(str:varchar, substr:varchar): str# 内の subsrtr の最初の出現を返します。例: 文字列 ab/cd/abc.html 内の b の最初の出現を検索します。select instr('ab/cd/abc.html', 'b');
# プログラマーが考えているのとは異なり、上記の結果は 2 です (添え字は 1 から始まりますので注意してください)

逆(str:varchar): 文字列を先頭から末尾まで反転し、abcを入力してcbaを出力します。

length(str:varcha): 文字列の長さを返します

上記の情報を知った後、ほとんどの人は lastInfdexOf 関数の実装方法を知っていると思います。

直接与える:

select length('入力文字列') - instr(reverse('入力文字列'), '検索する文字列');
# 例: 文字列 'ab/cd/abc.html' 内の '/' の最後の位置を検索します。結果は次のとおりです: 5
length('ab/cd/abc.html') - instr(reverse('ab/cd/abc.html'), '/') を選択します。

最後に、最近私が遭遇した小さな要件を以下に示します。

データベース フィールドの値 (値は ab/cd/abc.html などのファイルのパス名) を取得し、ファイル名 (abc.html) を解析する SQL スクリプトを記述します。

右から選択(CONTENT_NAME, instr(reverse(CONTENT_NAME), '/') - 1) FILE_NAME
config_template_contentから
where lower(CONTENT_NAME) like '%/%.html';
# データに / が含まれている場合はこれで十分です。フィールド値が abcde.html の場合は判断が必要です〜

上記は正しい機能の使い方です。その有用性はご自身で探して(体験して)みてください。

補足: mysql の SELECT LAST_INSERT_ID() ステートメントの使用時に発生する問題

序文:

主キーが自動増分であるデータベース テーブル (ユーザー テーブルなど) にレコードを挿入する場合、書き込まれたばかりのレコードの ID を取得することが期待されます (シナリオによっては、他の操作を実行するためにこの ID を取得する必要があるため)。この時点で、SELECT LAST_INSERT_ID() ステートメントを使用して、レコードが挿入された後に返される自動増分 ID の値を取得する必要があります。

例:

 /**
 * 苦情情報を挿入 * @param complaintInfoModel
 * @戻る
 */
 @InsertProvider(タイプ = ComplaintInfoDao.ComplaintProviderSql.class、メソッド = "insertComplaintInfo")
 @SelectKey(ステートメント="SELECT LAST_INSERT_ID()", keyProperty="id", before=false, resultType=Integer.class)
 Integer insertComplaintInfo(ComplaintInfoModel complaintInfoModel); // データを挿入し、変更されたデータベースエントリの数を返します

Mybatis の SelectKey は、データ挿入時に主キーが自動的に生成されない問題を解決するためのものです。主キーの生成方法を任意に設定できます。しかし、SelectKey がどれだけ優れていても、このような状況に遭遇しないようにしてください。結局のところ、非常に面倒です。

selectKey 属性

財産説明する
キープロパティselectKey ステートメントの結果を設定するターゲット プロパティ。
結果タイプ

結果のタイプ。

MyBatis は通常それを理解できますが、書くことも問題ありません。 MyBatis では、文字列を含む任意の単純な型を主キー型として使用できます。

注文

これは BEFORE または AFTER に設定できます。

BEFORE に設定すると、最初に主キーを選択し、keyProperty を設定してから、挿入ステートメントを実行します。

AFTER に設定すると、挿入ステートメントが最初に実行され、その後に selectKey 要素が実行されます。これは、シーケンス呼び出しを挿入ステートメントに埋め込むことができる Oracle などのデータベースに似ています。

ステートメントタイプ

これまでと同様に、MyBatis は STATEMENT、PREPARED、CALLABLE ステートメントのマッピング タイプをサポートしています。

それぞれ PreparedStatement および CallableStatement タイプを表します。

----1. SelectKeyは順序属性に注意する必要があります。

MySQL などの自動拡張をサポートするデータベースでは、正しい値を取得するために order を after に設定する必要があります。

Oracle のようなシーケンスを取得する場合は、before に設定する必要があります。そうしないと、エラーが報告されます。

-----2. さらに、Springを使用してトランザクションを管理する場合、

SelectKey と insert は同じトランザクション内にあるため、この場合、データがデータベースに挿入されないため、Mysql は自動的に増加されたキーを取得できません。

トランザクション管理をキャンセルすれば問題は発生しません。

以下は XML と注釈の例です。SelectKey は非常に単純なので、次の 2 つの例で十分です。

<挿入id="挿入" パラメータタイプ="マップ"> 
 テーブル1 (名前) の値 (#{名前}) に挿入します 
 <selectKey 結果タイプ="java.lang.Integer" キープロパティ="id"> 
  コールID() 
 </selectKey> 
 </挿入>

上記の xml の入力パラメータは map であり、selectKey は結果を入力パラメータ map に格納します。 POJO でも状況は同じですが、注意すべき点が 1 つあります。keyProperty に対応するフィールドには、POJO 内に対応する setter メソッドが必要であり、setter のパラメーター型が一貫している必要があります。そうでない場合は、エラーが報告されます。

@Insert("table2 (name) の値(#{name}) に挿入") 
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class) 
int insertTable2(名前 name);

上記は注釈の形式です。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Mysql マスタースレーブ同期 Last_IO_Errno:1236 エラー解決
  • MySQLとElasticsearch間のデータ非対称性問題の解決策
  • MySQL レプリケーション エラー Last_SQL_Errno:1146 の解決方法
  • Mysql の LAST_INSERT_ID() 関数の使用に関する詳細な説明

<<:  ウェブページ作成時のHTMLタグの使用に注意してください

>>:  Dockerネットワーク作成に--subnetを追加した後の問題を解決する

推薦する

Vueにおける仮想DOMの理解のまとめ

これは本質的に、ビュー インターフェース構造を記述するために使用される共通の js オブジェクトです...

CSS ブラウザ互換性の問題に対する 4 つの解決策

フロントエンドは、技術が急速に進化するだけでなく、知っておくべき事柄が多すぎるという理由で大変な仕事...

CSS3で実装されたサムネイルホバー効果

成果を達成する実装コードhtml <ヘッダー> <h1><em>...

Vueはカウントダウン機能を実装する

この記事の例では、カウントダウン機能を実装するためのVueの具体的なコードを参考までに共有しています...

固定テーブル幅テーブルレイアウト: 固定

テーブルを画面全体(残りの空白領域)に表示するために、幅属性は 100% と定義されることが多く、セ...

Dockerに関するよくある質問

Docker はポートを IPv6 にのみマッピングし、IPv4 にはマッピングしません。 dock...

MySQL データ型の詳細

目次1. 数値型1.1 数値型の分類1.1.1 浮動小数点数1.1.2 ビットタイプ1.1.3 時間...

データベースミドルウェアMyCatの紹介

1. Mycatの適用シナリオMycat は幅広いシナリオに合わせて開発されており、新しいユーザーが...

ボタンをクリックしてテキストを入力ボックスに変換し、保存をクリックしてテキスト実装コードに変換します。

ボタンをクリックしてテキストを入力ボックスに変換し、保存をクリックしてテキスト実装コードに変換します...

Linux lnコマンドの使用

1. コマンドの紹介ln コマンドは、ファイルのリンクを作成するために使用されます。リンクは、ハード...

DockerはClickHouseをインストールし、データテストを初期化します

クリックハウスの紹介ClickHouse は、SQL クエリを使用して分析データ レポートをリアルタ...

すべてのブラウザとの完全な互換性を実現するために最適なプリセットを選択してください

各ブラウザの select タグのプロパティと各ブラウザのサポートが多少異なるため、各ブラウザでの選...

CSS で QR コードスキャンボックスを実装するためのサンプルコード

カメラを開くと通常はスキャンボックスが表示されますが、静的なQRコードではフォーカスを合わせたりスキ...

MySQL 8.0 のメモリ消費の詳細な分析

目次1. innodb_buffer_pool_size 2. innodb_log_buffer_...

固定ボトムコンポーネントを実装した Vue の例

目次【効果】 【実施方法】 【効果】 【実施方法】 <テンプレート> <div i...