読者です 読者をやめる 読者になる 読者になる

blogですかい

株式会社Loco Partnersに勤めるエンジニアうちの一人のブログ。仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

スラブ圏で女性が結婚した時に名前を変化させるストアドプロシージャ #mysqlcasual

注意

名前に関する本文の記述は不正確なものです。
コメント欄もご覧ください。

MySQL Casual Talks Vol.4へ参加してきました。

最も印象に残った話の一つが@meijikさんの、スラブ圏では女性が結婚すると苗字に '-ova' が付くという話。
例えば Ryoko Tamura という女性が Tani という苗字の男性と結婚すると Ryoko Taniova となるらしい。 また、旧姓を残す場合は Ryoko Taniova Tamuraova となるとのこと。

そこで、スラブ圏の女性が結婚した際に名前を変化させるストアドプロシジャを書いてみた。

mysql> /* ↓のようなpersonテーブルがあったとします */
mysql> SHOW CREATE TABLE person\G
*************************** 1. row ***************************
       Table: person
Create Table: CREATE TABLE `person` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(40) NOT NULL,
  `middle_name` varchar(40) NOT NULL,
  `last_name` varchar(40) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> /* Ryoko Tamura という女性と、Taniという苗字の男性が登録されています */
mysql> SELECT * FROM person;
+----+------------+-------------+-----------+
| id | first_name | middle_name | last_name |
+----+------------+-------------+-----------+
|  1 | Ryoko      |             | Tamura    |
|  2 |            |             | Tani      |
+----+------------+-------------+-----------+
2 rows in set (0.00 sec)

mysql> /* 結婚した時に女性の名前を変化させるストアドプロシージャを↓のように定義します */
mysql> SHOW CREATE PROCEDURE kekkon\G
*************************** 1. row ***************************
           Procedure: kekkon
            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
    Create Procedure: CREATE PROCEDURE `kekkon`(IN `dannaId` int unsigned, IN `yomeId` int unsigned)
BEGIN
DECLARE dannaLastName VARCHAR(40);

DECLARE cur CURSOR FOR SELECT P.last_name FROM person P WHERE P.id=dannaId ;

OPEN cur;
FETCH cur INTO dannaLastName;
UPDATE person SET middle_name=CONCAT(dannaLastName,'ova'),last_name=CONCAT(last_name,'ova') WHERE id=yomeId;
CLOSE cur;
END
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)

mysql> /* id=2の男性とid=1の女性が結婚します */
mysql> CALL kekkon(2,1);
Query OK, 1 row affected (0.01 sec)

mysql> /* 女性のmiddle_name,last_nameが変わります */
mysql> SELECT * FROM person;
+----+------------+-------------+-----------+
| id | first_name | middle_name | last_name |
+----+------------+-------------+-----------+
|  1 | Ryoko      | Taniova     | Tamuraova |
|  2 |            |             | Tani      |
+----+------------+-------------+-----------+
2 rows in set (0.00 sec)

このようにストアドプロシージャを定義しておけば、スラブ圏のユーザが結婚した際にわざわざUPDATE文を書かずに名前を変更できますね。