张家口建设厅网站,市场营销的对象有哪些,网站建设推广渠道,设计类专业笔记本电脑推荐背景
据说 如果你熟悉 MySQL#xff0c;切换到 PostgreSQL 就像从 Windows 切换到 macOS#xff1a;都是电脑#xff0c;比较简单#xff0c;
但是 但操作习惯不同。
老是不习惯 写篇文章对比一下吧 给其他小伙伴
基础连接对比
MySQL
# 连接数据库
mysql -u root -p# 进入…背景据说 如果你熟悉 MySQL切换到 PostgreSQL 就像从 Windows 切换到 macOS都是电脑比较简单但是 但操作习惯不同。老是不习惯 写篇文章对比一下吧 给其他小伙伴基础连接对比MySQL# 连接数据库mysql -u root -p# 进入后mysqlSHOW DATABASES;mysqlUSE database_name;mysqlSHOW TABLES;PostgreSQL# 连接数据库psql -U postgres -d database_name# 进入后postgres# \l -- 相当于 SHOW DATABASESpostgres# \c database_name -- 相当于 USE database_namepostgres# \dt -- 相当于 SHOW TABLES常用操作对照表操作MySQLPostgreSQL解释查看所有数据库SHOW DATABASES;\lPostgreSQL 用反斜杠命令使用数据库USE dbname;\c dbname切换当前数据库查看所有表SHOW TABLES;\dt注意是\dt不是/dt查看表结构DESC table_name;\d table_namePostgreSQL 的\d更强大查看表详情SHOW CREATE TABLE table_name;\d table_name显示索引、约束等退出客户端exit;或quit;\q简单一个字母执行SQL文件source file.sql;\i file.sql导入外部SQL查看帮助help;\?元命令帮助SQL语法关键差异1. 限制查询结果-- MySQLSELECT*FROMuserLIMIT10;-- PostgreSQLSELECT*FROMuserLIMIT10;-- 或更标准的SELECT*FROMuserFETCHFIRST10ROWSONLY;2. 自增ID-- MySQLCREATETABLEuser(idINTAUTO_INCREMENTPRIMARYKEY);-- PostgreSQLCREATETABLEuser(idSERIALPRIMARYKEY);-- 或现代方式CREATETABLEuser(idINTGENERATED ALWAYSASIDENTITYPRIMARYKEY);3. 字符串连接-- MySQLSELECTCONCAT(name, (,phone,))FROMuser;-- PostgreSQLSELECTname|| (||phone||)FROMuser;-- 或SELECTCONCAT(name, (,phone,))FROMuser;4. 当前时间-- MySQLSELECTNOW();-- 2025-01-15 10:30:00SELECTCURDATE();-- 2025-01-15-- PostgreSQLSELECTNOW();-- 2025-01-15 10:30:00.12345608SELECTCURRENT_DATE;-- 2025-01-15 (注意没有括号)实战示例用户表操作创建用户表-- MySQLCREATETABLEuser(idVARCHAR(20)PRIMARYKEY,phoneVARCHAR(15)UNIQUENOTNULL,passwordVARCHAR(128),nameVARCHAR(50),ageINT,created_atBIGINTDEFAULTUNIX_TIMESTAMP(),updated_atBIGINTDEFAULTUNIX_TIMESTAMP()ONUPDATEUNIX_TIMESTAMP());-- PostgreSQLCREATETABLEuser(idVARCHAR(20)PRIMARYKEY,phoneVARCHAR(15)UNIQUENOTNULL,passwordVARCHAR(128),nameVARCHAR(50),ageINT,created_atBIGINTDEFAULTEXTRACT(EPOCHFROMNOW()),updated_atBIGINTDEFAULTEXTRACT(EPOCHFROMNOW()));-- PostgreSQL 需要创建触发器来更新 updated_atCREATEORREPLACEFUNCTIONupdate_updated_at_column()RETURNSTRIGGERAS$$BEGINNEW.updated_atEXTRACT(EPOCHFROMNOW());RETURNNEW;END;$$languageplpgsql;CREATETRIGGERupdate_user_updated_at BEFOREUPDATEONuserFOR EACH ROWEXECUTEFUNCTIONupdate_updated_at_column();查询用户数据-- 两者通用PostgreSQL 表名需要引号SELECT*FROMuserWHEREphone13634759152;-- 时间戳转换PostgreSQL 更强大-- MySQLSELECTFROM_UNIXTIME(created_at)FROMuser;-- PostgreSQLSELECTTO_TIMESTAMP(created_at)FROMuser;SELECTcreated_at*INTERVAL1 secondFROMuser;为什么会有这些差异历史原因两个数据库独立发展30年标准遵循PostgreSQL 更遵循 SQL 标准设计理念MySQL简单快速“够用就好”PostgreSQL功能完备“严格标准”迁移时需要改什么代码层面连接字符串# MySQLmysqlpymysql://user:passlocalhost/db# PostgreSQLpostgresqlpsycopg2://user:passlocalhost/dbORM配置# SQLAlchemy 中# MySQL 可以用 AUTO_INCREMENT# PostgreSQL 用 SERIAL 或 IDENTITY运维层面备份恢复# MySQLmysqldump -u root dbbackup.sql mysql -u root dbbackup.sql# PostgreSQLpg_dump -U postgres dbbackup.sql psql -U postgres dbbackup.sql权限管理PostgreSQL 更细粒度也更复杂 但是主流推荐你应该选择哪个选 MySQL 如果需要简单快速上手项目主要是读操作团队熟悉 MySQL 生态使用 WordPress、Laravel 等框架选 PostgreSQL 如果需要复杂查询和事务数据一致性要求高需要 JSON、GIS、全文搜索等高级功能项目会长期发展需要扩展性常见坑点提醒表名大小写PostgreSQL 默认小写如果创建了User查询必须用引号反斜杠 vs 正斜杠\dt✓/dt✗命令结束符两者都用;但 PostgreSQL 的元命令不用时间处理PostgreSQL 时区处理更严格一句话建议把 PostgreSQL 当成一个全新的数据库来学不要尝试把 MySQL 的习惯带过去。掌握\开头的元命令理解严格的大小写和类型系统你会发现 PostgreSQL 的强大之处。据说如果你用 Docker两者的差异会更明显。PostgreSQL 的数据卷需要正确配置权限而 MySQL 通常 “just works”。