【原创】MySQL返回更新值(RETURNING)
在写SQL中,经常会有诸如更新了一行记录,之后要获取更新过的这一行。 本身从程序来说,没啥难度,大不了把这行缓存起来,完了直接访问。 但是从数据库的角度出发,怎么能快速的拿出来,而又不对原表进行二次扫描? 比如其他数据库提供了如下的语法来实现:
在写SQL中,经常会有诸如更新了一行记录,之后要获取更新过的这一行。 本身从程序来说,没啥难度,大不了把这行缓存起来,完了直接访问。 但是从数据库的角度出发,怎么能快速的拿出来,而又不对原表进行二次扫描? 比如其他数据库提供了如下的语法来实现:
返回更新掉的行:
t_girl=# update t1 set log_time = now() where id in (1,2,3) returning *; id | log_time ----+---------------------------- 1 | 2014-11-26 11:06:53.555217 2 | 2014-11-26 11:06:53.555217 3 | 2014-11-26 11:06:53.555217 (3 rows) UPDATE 3 Time: 6.991 ms
返回删除掉的行:
t_girl=# delete from t1 where id < 2 returning *; id | log_time ----+---------------------------- 1 | 2014-11-26 11:06:53.555217 (1 row) DELETE 1 Time: 6.042 ms
返回插入后的行:
t_girl=# insert into t1 select 1,now() returning *; id | log_time ----+---------------------------- 1 | 2014-11-26 11:07:40.431766 (1 row) INSERT 0 1 Time: 6.107 ms t_girl=#
那在MySQL里如何实现呢?
我可以创建几张内存表来来保存这些返回值,如下:
CREATE TABLE t1_insert ENGINE MEMORY SELECT * FROM t1 WHERE FALSE; CREATE TABLE t1_update ENGINE MEMORY SELECT * FROM t1 WHERE FALSE; CREATE TABLE t1_delete ENGINE MEMORY SELECT * FROM t1 WHERE FALSE; ALTER TABLE t1_insert ADD PRIMARY KEY (id); ALTER TABLE t1_update ADD PRIMARY KEY (id); ALTER TABLE t1_delete ADD PRIMARY KEY (id);
以上建立了三张表来存放对应的操作。 t1_insert 保存插入;t1_update 保存更新;t1_delete 保存删除。
那这样的话,我来创建对应的触发器完成。
DELIMITER $$ USE `t_girl`$$ DROP TRIGGER /*!50032 IF EXISTS */ `tr_t1_insert_after`$$ CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER `tr_t1_insert_after` AFTER INSERT ON `t1` FOR EACH ROW BEGIN REPLACE INTO t1_insert VALUES (new.id,new.log_time); END; $$ DELIMITER ;
DELIMITER $$ USE `t_girl`$$ DROP TRIGGER /*!50032 IF EXISTS */ `tr_t1_update_after`$$ CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER `tr_t1_update_after` AFTER UPDATE ON `t1` FOR EACH ROW BEGIN REPLACE INTO t1_update VALUES (new.id,new.log_time); END; $$ DELIMITER ;
DELIMITER $$ USE `t_girl`$$ DROP TRIGGER /*!50032 IF EXISTS */ `tr_t1_delete_after`$$ CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER `tr_t1_delete_after` AFTER DELETE ON `t1` FOR EACH ROW BEGIN REPLACE INTO t1_delete VALUES (old.id,old.log_time);; END; $$ DELIMITER ;
创建好了以上的表和触发器后, 拿到返回值就非常容易了, 我直接从以上几张表来查询就是。
我现在来演示:
更新:
mysql> truncate table t1_update; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE t1 SET log_time = NOW() WHERE id < 15; Query OK, 3 rows affected (0.01 sec) Rows matched: 3 Changed: 3 Warnings: 0
获取更新记录:
mysql> select * from t1_update; +----+----------------------------+ | id | log_time | +----+----------------------------+ | 12 | 2014-11-26 13:38:06.000000 | | 13 | 2014-11-26 13:38:06.000000 | | 14 | 2014-11-26 13:38:06.000000 | +----+----------------------------+ 3 rows in set (0.00 sec)
插入:
mysql> truncate table t1_insert; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t1 VALUES (1,NOW()); Query OK, 1 row affected (0.08 sec)
获取插入记录:
mysql> select * from t1_insert; +----+----------------------------+ | id | log_time | +----+----------------------------+ | 1 | 2014-11-26 13:38:06.000000 | +----+----------------------------+ 1 row in set (0.00 sec)
删除:
mysql> truncate table t1_delete; Query OK, 0 rows affected (0.00 sec) mysql> DELETE FROM t1 WHERE id < 15; Query OK, 4 rows affected (0.01 sec)
获取删除记录:
mysql> select * from t1_delete; +----+----------------------------+ | id | log_time | +----+----------------------------+ | 1 | 2014-11-26 13:38:06.000000 | | 12 | 2014-11-26 13:38:06.000000 | | 13 | 2014-11-26 13:38:06.000000 | | 14 | 2014-11-26 13:38:06.000000 | +----+----------------------------+ 4 rows in set (0.00 sec)

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

ルートとしてMySQLにログインできない主な理由は、許可の問題、構成ファイルエラー、一貫性のないパスワード、ソケットファイルの問題、またはファイアウォール傍受です。解決策には、構成ファイルのBind-Addressパラメーターが正しく構成されているかどうかを確認します。ルートユーザー許可が変更されているか削除されてリセットされているかを確認します。ケースや特殊文字を含むパスワードが正確であることを確認します。ソケットファイルの許可設定とパスを確認します。ファイアウォールがMySQLサーバーへの接続をブロックすることを確認します。

MySQLがテーブル構造を変更すると、メタデータロックが通常使用され、テーブルがロックされる可能性があります。ロックの影響を減らすために、次の測定値をとることができます。1。オンラインDDLでテーブルを使用できます。 2。バッチで複雑な変更を実行します。 3.小規模またはオフピーク期間中に操作します。 4. PT-OSCツールを使用して、より細かい制御を実現します。

データ統合の簡素化:AmazonrdsmysqlとRedshiftのゼロETL統合効率的なデータ統合は、データ駆動型組織の中心にあります。従来のETL(抽出、変換、負荷)プロセスは、特にデータベース(AmazonrdsmysQlなど)をデータウェアハウス(Redshiftなど)と統合する場合、複雑で時間がかかります。ただし、AWSは、この状況を完全に変えたゼロETL統合ソリューションを提供し、RDSMYSQLからRedshiftへのデータ移行のための簡略化されたほぼリアルタイムソリューションを提供します。この記事では、RDSMysQl Zero ETLのRedshiftとの統合に飛び込み、それがどのように機能するか、それがデータエンジニアと開発者にもたらす利点を説明します。

MySQLは、複数の同時接続を処理し、マルチスレッド/マルチプロセスを使用して、各クライアントのリクエストに独立した実行環境を割り当てて、邪魔されないことを確認できます。ただし、同時接続の数は、システムリソース、MySQL構成、クエリパフォーマンス、ストレージエンジン、ネットワーク環境の影響を受けます。最適化では、コードレベル(効率的なSQLの書き込み)、構成レベル(MAX_Connectionの調整)、ハードウェアレベル(サーバー構成の改善)などの多くの要因を考慮する必要があります。

MySQLデータベースでは、ユーザーとデータベースの関係は、アクセス許可と表によって定義されます。ユーザーには、データベースにアクセスするためのユーザー名とパスワードがあります。許可は助成金コマンドを通じて付与され、テーブルはCreate Tableコマンドによって作成されます。ユーザーとデータベースの関係を確立するには、データベースを作成し、ユーザーを作成してから許可を付与する必要があります。

MySQLはAndroidで直接実行できませんが、次の方法を使用して間接的に実装できます。Androidシステムに構築されたLightWeight Database SQLiteを使用して、別のサーバーを必要とせず、モバイルデバイスアプリケーションに非常に適したリソース使用量が少ない。 MySQLサーバーにリモートで接続し、データの読み取りと書き込みのためにネットワークを介してリモートサーバー上のMySQLデータベースに接続しますが、強力なネットワーク依存関係、セキュリティの問題、サーバーコストなどの短所があります。

1.正しいインデックスを使用して、データの量を削減してデータ検索をスピードアップしました。テーブルの列を複数回検索する場合は、その列のインデックスを作成します。あなたまたはあなたのアプリが基準に従って複数の列からのデータが必要な場合、複合インデックス2を作成します2。選択した列のみを避けます。必要な列のすべてを選択すると、より多くのサーバーメモリを使用する場合にのみサーバーが遅くなり、たとえばテーブルにはcreated_atやupdated_atやupdated_atなどの列が含まれます。

MySQLは、インストールが簡単で、強力で管理しやすいため、初心者に適しています。 1.さまざまなオペレーティングシステムに適した、単純なインストールと構成。 2。データベースとテーブルの作成、挿入、クエリ、更新、削除などの基本操作をサポートします。 3.参加オペレーションやサブクエリなどの高度な機能を提供します。 4.インデックス、クエリの最適化、テーブルパーティション化により、パフォーマンスを改善できます。 5。データのセキュリティと一貫性を確保するために、バックアップ、リカバリ、セキュリティ対策をサポートします。
