
ãPostgreSQLã¯ç§ã®å°ããªãããžã§ã¯ãã«ã¯è€éããããããMySQLã䜿ãç¶ããŸããããšããäžé£ã®æã«çµ¶ããåºããããŸãã
ãã®èšäºã§ã¯ãMySQLãç¥ã£ãŠãã人ãPostgreSQLã§éçºãå§ããããšã¯é£ãããªãããšã瀺ããããšæããŸãã
ç§ã¯éåžžã«é ãããå§ããŸã
å€å žçãªäŸçµŠãšéèŠã®çµæžæ³åã¯ã補åã®äŸ¡æ ŒãäžãããšéèŠãèªåçã«å¢ããããšã瀺åããŠããŸãã ããããå®éã«ã¯ããã¯å®å šã«çå®ã§ã¯ãããŸããããªããªã人ã ã¯å®å šãªæ å ±ãæã£ãŠããªãããã§ãã
æé£ã«ã¹ã¯ã©ã³ãã«ãšãã°ãäœããããšããŸãããã ãããŠãåµãå¿ èŠã§ãã
æé©ãªçµæãåŸãã«ã¯ããã¹ãŠã®åºã«è¡ããäŸ¡æ Œãå質ãæ¯èŒãã顧客ã¬ãã¥ãŒãèããŠãæçµçã«æäœäŸ¡æ Œã§åãå ¥ãããã補åãéžæããå¿ èŠããããŸãã åœç¶ã誰ããããè¡ããŸããããªããªããããããã¹ãŠãããŠããéã飢hungã§æ»ã¬å¯èœæ§ãé«ãããã§ãã
ãããã¯ãäŸãã°ãããªãã¯æãã¯ãŒã«ãªã¹ã¿ãŒãã¢ãããäžçã奜転ãããã¹ããµã€ããäœããŸããã ãããã圌ã®ããšã誰ãç¥ããªããã°ã圌ã¯ãŸã£ããç¥ããªãããã§ãã åºåãããŒã±ãã£ã³ã°ãªã©ãå¿ èŠ
èšãæãããšã補åã®å質ãšäŸ¡æ Œã ãã§ãªããçµç¹ã®åé¡ã«ãã£ãŠã¯ææ決å®ã®ã³ã¹ããéèŠã§ãã ãããŠãããã¯ãã¹ãŠéåžžã«éèŠã§ãã ãã®èšäºã§ã¯ãpostgresql DBMSã«åãæ¿ããã³ã¹ããå°ãåæžããããšæããŸãã ã€ãŸã ãåµäŸ¡æ Œããææ¡ããŸãã
æåŸã®pgdayã§ãOleg Buninã¯ã¹ããŒããè¡ããŸããã圌ã¯ãPostgreSQLã¯ããã®ã¯ãŒã«ãã«ããããããããããžã§ã¯ãã§ã¯ããŸã䜿çšãããªããšããå€ãã®æ£ããããšãè¿°ã¹ãŸããã ããŸããŸãªçç±ããããŸãããããã®ã»ãšãã©ã¯å®å šã«åæããŸãã
ãããïŒ åæã«ããªã¬ã°ã¯ã¯ã©ã€ã¢ã³ãããæ°ãããããžã§ã¯ãã«MySQLã䜿çšããããã«å§ãããšãã圌ã®ç·Žç¿ããäŸãæããŸãããããŒã å šäœïŒæ¢ã«çèãéããæ¹æ³ãç¥ã£ãŠããïŒãæåããPostgreSQLããæžãçŽãããšã¯ã§ããªãããã§ãã æžç±ãã³ãŒã¹ãªã©ãå°ãªã ãããŠæçµçã«ãããžãã¹ã¯ããã«èŠããã§ãããã
ããã¯å®å šã«çå®ã§ã¯ãªããšæããŸãã
å žåçãªMySQLãããžã§ã¯ããåãäžããŸãã ããã§äœã䜿ãããŠããŸããïŒ 99ïŒ ã®ã±ãŒã¹ã§ã¯ããããã¯æãåçŽãªã¯ãšãªã§ããããã¯ããããŸã§ã®ãšããååž°CTEããŠã£ã³ããŠé¢æ°ïŒå°æ¥ã®ããŒãžã§ã³ã§èšç»ãããŠããŸããïŒãã«ã¹ã¿ã ããŒã¿åãé åã®é«åºŠãªäœæ¥ãåŒã®ã€ã³ããã¯ã¹ãªã©ããªãããã§ãã qãªã©
ããŸããŸãªããŒã¹ã§åçŽãªã¯ãšãªã®æ§æãæ¯èŒããŸãããã
MySQLïŒ
SELECT name FROM users WHERE id = 5; UPDATE users SET name = '' WHERE id = 5; INSERT INTO users (name) VALUES ('');
PostgresïŒ
-- SELECT name FROM users WHERE id = 5; UPDATE users SET name = '' WHERE id = 5; INSERT INTO users (name) VALUES ('');
ãã®æ©èœã¯ãã§ã«å€ãã®ããšãæžãã®ã«ååã§ãã
ç³ãåãªããç³ãåãªããããã€ãã®ãã¥ã¢ã³ã¹ããããŸãã
MySQLã§ã¯ãè€éãªèå¥åã¯`ã§ãšã¹ã±ãŒãã§ããé²è¡äžã«äœ¿çšãããŸã" ïŒãããã£ãŠãæååå®æ°ã§ã¯äžéåŒçšç¬Šã䜿çšããå¿ èŠããããŸãïŒ
MySQLã¯INSERT IGNORE ...ã䜿çšããŸãã
posgres INSERT ... ON CONFLICTã§...
é²è¡äžã®INET_NTOAé¢æ°ã¯ãããŸããããä»ã®æ¹æ³ã§åãããšãè¡ãæ¹æ³ããããããããŸãã
MySQLã§ã¯ããã®çšèªã¯DATABASEãšåŒã°ããpostgresã§ã¯ãåããã®ãSCHEMAãšåŒã°ããŸãã
MySQLã§ã¯ãbigserialã§BIGINT AUTO_INCREMENTãèšè¿°ããå¿ èŠããããŸã
ä»ã«ãéãããããäžè¬çãªã倧èŠæš¡ããšåãã§ãã
ããããç§ã«èšã£ãŠãã ãããåŒçšç¬Šããã®ä»ã®å°ããªãã¥ã¢ã³ã¹ãç解ããããšã¯éåžžã«é£ããã§ããïŒ
ããããè³ãè©ã«æ±ããŠãã人ã¯ããããã®éãã®ä¿¡ããããªãã»ã©ã®æ·±ããç解ããããã«æ¬ãè¬åº§ãå¿ èŠãšããªãããã«æããŸãã ååãªæåãŸãã¯æããªStackOverflowã
ãããŠãããã¯å®è·µã«ãã£ãŠå®å šã«ç¢ºèªãããŸããïŒå€ãã®ãããžã§ã¯ãã¯åã«postgresã«ç§»è¡ããŸããïŒæåã¯ãã¹ãŠmysqlã®ããã«1察1ã§äœ¿çšããŠããŸããããããããåããŠãããŸããŸãªæ©èœãæ€èšããŠæ°ããæ©èœãå°å ¥ãå§ããŸãã
ç§ã¯ãã°ãã°å¥ã®è°è«ãèããŸãïŒãããããŸããããã¯ç§ããã¹ã¿ãŒã§ããªããããªå®å®è¹ã®ãããªãã®ã§ãã ããããã¹ãŠã®CTEããã³éšåã€ã³ããã¯ã¹ã¯ãããããã¹ãŠåŠã¶ã®ãé¢åã§ãã ç§ã®ãããžã§ã¯ãã«ã¯ååãªMySQLæ©èœããããŸãã
ã¯ããæ°ã«ããªãã§ãã ãããåçŽãªãããžã§ã¯ãã®å Žåãæ ç¹éã«éãã¯ãŸã£ãããããŸããã ãããã£ãŠãéçºè ã®èŠ³ç¹ããã¯ãpostgresã«ããè¿œå è²»çšã¯çºçããŸããã ïŒãããžã§ã¯ãïŒã倧ãããªã£ãå ŽåãåŸã§ããŒã¿ããŒã¹ã®é«åºŠãªæ©èœãå¿ èŠã«ãªãå ŽåããããŸãã
-CTEã§è€éãªã¯ãšãªãç°¡çŽ å
-ãŠã£ã³ããŠé¢æ°ã䜿çšããŠã1ã€ã®èŠæ±ã§äžåºŠã«å€ãã®ããšãè¡ããŸãã
-è€æ°ã®CREATE TABLEãALTER TABLEãªã©ãå®è¡ããæ©èœ ãã©ã³ã¶ã¯ã·ã§ã³ã®äžéšãšããŠïŒããã³äœãåé¡ãçºçããå Žåã¯éäžã§ããŒã«ããã¯ããŸãïŒ
-CREATE INDEX CONCURRENTLYïŒããŒã¿ããŒã¹ãã©ããããã«å€§ããªããŒãã«ã«ã€ã³ããã¯ã¹ãäœæããŸãïŒ
-ãããªã¢ã©ã€ãºããã¥ãŒ
-åŒã«ããã€ã³ããã¯ã¹ïŒãã®å Žåãåå¥ã®åãçæããã³ç¶æãã代ããã«ïŒ
-éšåã€ã³ããã¯ã¹ïŒäžéšã®ã¯ãšãªãé«éåããããããŸãã¯æ¡ä»¶ã«ããäžææ§ã確ä¿ãããããªã©ïŒ
-ããŸããŸãªã€ã³ããã¯ã¹ïŒgistãginãbrinãªã©ïŒã
-ããšãã°ãunnestããã³arrayé¢æ°ã䜿çšããŠãé åãæäœããŸã
-ã¬ããªã±ãŒã·ã§ã³ãããã¹ã¿ã³ãã€
-ç¶æ¿ããŒãã«
-ã«ã¹ã¿ã ããŒã¿åãšå€æã«ãŒã«ïŒåã®äœæããã£ã¹ãã®äœæïŒã ããšãã°ãip4rã¿ã€ãã§ã¯ãIPã¢ãã¬ã¹ã®ç¯å²ãç°¡åãã€è¿ éã«æäœã§ããŸãïŒgistã€ã³ããã¯ã¹ã䜿çšããŠãç¯å²å ã®IPæ€çŽ¢ã«ã€ã³ããã¯ã¹ãä»ããããšãã§ããŸãïŒã
-ã«ã¹ã¿ã æŒç®åïŒCREATE OPERATORïŒã ç§ã¯èªåã§è©Šããããšã¯ãããŸãããããã®æ¹åãèŠãŸã
-ããŸããŸãªèšèªãããšãã°javascriptïŒplv8ïŒãŸãã¯pythonã®ã¹ãã¢ãããã·ãŒãžã£
-ã¿ã€ã ãŸãŒã³ä»ãã¿ã€ã ïŒã¿ã€ã ãŸãŒã³ä»ãã¿ã€ã ã¹ã¿ã³ãïŒ
-ããŒãã«å ã®åããã°ããåé€ããã³è¿œå
-ã€ã³ããã¯ã¹å¯èœãªJSONïŒjsonbã¿ã€ãïŒ
-ãã§ãã¯ã«ããããŒã¿ã®æ€èšŒïŒãã®äžã§ãããšãã°ãjsonã§å¿ èŠãªèŠçŽ ã®æç¡ã確èªã§ããŸãïŒ
-auto_incrementã®ä»£ããã«é åºä»ãïŒã«ãŒããå®è¡ããããè€æ°ã®ããŒãã«ã«å ±éãããªã©ïŒ
-å€éšããŒã¿ã©ãããŒ-sgresaãmysqlãcsvãã¡ã€ã«ã®ããŒãã«ã1ã€ã®ã¯ãšãªã§çµåã§ããŸã
-ããã³100500ã®ãã®ä»ã®æ©èœãæ¡åŒµæ©èœãããã«ã¯ãã©ãŒã¯ã ç§ã¯é·å¹Žã«ããã£ãŠèŠªãšä»äºãããŠããŸããããåžžã«æ°ããæ©äŒãéããŠããŸãã
å ¬å¹³ã«èšããšãmysqlã¯é 調ã«éçºãããã¬ã¬ã·ãŒãé€å»ãå§ããŠããããã«èŠããããšã«æ³šæããŠãã ããã ã€ãŸãã5.5ã§èµ·ãã£ãããšãšçŸåšã®ããšã¯å€§ããªéãã§ãïŒããšãã°ãããã©ã«ãã®ã¹ããªã¯ãã¢ãŒãïŒã 次ã®ããŒãžã§ã³ã§ã¯ãã·ã¹ãã ããŒãã«ã§myisamã䜿çšããããšãæåŠããCTEãšãŠã£ã³ããŠé¢æ°ãè¿œå ãããšèšããŸããããã¯å€§ããªåé²ã§ãã ãããã䞻芳çã«ã¯ãåœåã®éãããã¯ãŸã ã眪ã®èåŸã«éåžžã«é ãé¢ããŠããŸãã ããããäžè¬ã«ãéæ¢ããŠããŸããïŒ wiki.postgresql.org/wiki/Todo ïŒ
äžèšã«æžãããŠããããšã¯ãã¹ãŠãéçºè ã®èŠ³ç¹ããã¯å ¬å¹³ã§ãã 管çè ãšdbaããŒã¹ã®èŠ³ç¹ããèŠããšãèšãããšã¯äœããããŸããã ãã ããåçŽãªãããžã§ã¯ãã®å ŽåããGoogleãšstackoverflowã§ååã§ãã
èŠçŽãããšãçè質ã®ããŒã ãé²è¡ç¶æ³ã«åºã¥ããŠãããžã§ã¯ããéå§ããã«ã¯ãç¹å®ã®è² è·ãããã¡ã€ã«ã®ããŒã¹ãèšå®ããã³åŒ·åãã人ã ããå¿ èŠã§ãã ïŒãã ããããã¯ãã¹ãŠã®DBMSã«åœãŠã¯ãŸããŸãïŒã ãã®ããžãã¹ã®ããã«ããã€ãã®dbaãéãããšãã§ããŸãã ãã ããã³ãŒãèªäœã¯åé¡ãªãèšè¿°ã§ããŸãã
ããã¯åãªãçè«çãªæšè«ã§ã¯ãªããç§èªèº«ã¯æ¬ãªã©ã䜿ããã«postgresqlã«ç§»è¡ãããããžã§ã¯ãã®äžéšãšããŠåããŠããŸããã ãããŠåŸã«ãæ°åè ãäžè¬ã«ãéçºã«ã·ãŒã ã¬ã¹ã«æ³šãã§ããŸãã ãšããã®ããã³ãŒããæçµçã«sgresaã®é«åºŠãªæ©èœãåãããšããäœãã©ã®ããã«å°ããããã®ããšãã人ã ããã§ã«ããããã§ãã
PS DBAãç§ã«èªãã§ãããªããHabrã®ãPostgreSQLã®ã€ã³ã¹ããŒã«ãšèšå®æ¹æ³ãã§åå¿è åãã®ããããããèšäºãæžããŠãã ããã åºæ¬ãã ç§èŠããã®èšäºã¯éåžžã«å¿ èŠã§ãã