将下面mysql语句切换为postgresql语句 -- 主表 CREATE TABLE biz_st_storage_controller ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, storage_name VARCHAR(100) NOT NULL COMMENT '存储名称', storage_model VARCHAR(50) NOT NULL COMMENT '存储型号', storage_serial VARCHAR(50) UNIQUE COMMENT '存储序列号', storage_disk_capacity VARCHAR(50) COMMENT '存储硬盘容量', storage_manage_ip VARCHAR(100) COMMENT '存储管理地址', storage_ip VARCHAR(100) COMMENT '存储地址', storage_username VARCHAR(100) COMMENT '存储账号', storage_password VARCHAR(100) COMMENT '存储密码' ); -- 硬盘框表 CREATE TABLE biz_st_disk_enclosure ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, storage_controller_id BIGINT UNSIGNED NOT NULL COMMENT '关联存储控制器', enclosure_id VARCHAR(30) NOT NULL UNIQUE COMMENT '物理框ID', enclosure_size VARCHAR(30) COMMENT '硬盘框尺寸', enclosure_count VARCHAR(30) COMMENT '硬盘框可插数量', enclosure_disk_size VARCHAR(30) COMMENT '硬盘框硬盘容量', enclosure_disk_classify VARCHAR(30) COMMENT '硬盘框硬盘分类', FOREIGN KEY (storage_controller_id) REFERENCES biz_st_storage_controller(id) ); -- 硬盘表 CREATE TABLE biz_st_disk ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, enclosure_id BIGINT UNSIGNED NOT NULL, type ENUM('SSD', 'HDD', 'NVMe', 'SAS') NOT NULL DEFAULT 'HDD' COMMENT '硬盘类型', model VARCHAR(50) NOT NULL COMMENT '硬盘型号', size_gb varchar(50) COMMENT '容量(GB)', position VARCHAR(20) NOT NULL COMMENT '位置', serial_number VARCHAR(50) COMMENT '序列号', size varchar(20) COMMENT '硬盘尺寸', FOREIGN KEY (enclosure_id) REFERENCES biz_st_disk_enclosure(id) ); -- 控制器表 CREATE TABLE biz_st_controller ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, storage_controller_id BIGINT UNSIGNED NOT NULL COMMENT '关联存储控制器', controller_management_ip VARCHAR(15) NOT NULL COMMENT '管理IP', controller_float_ip VARCHAR(15) COMMENT '浮动管理IP', controller_processor_ip VARCHAR(15) COMMENT '服务器处理器IP', controller_cache_capacity varchar(100) COMMENT '缓存容量(GB)', controller_cache_port varchar(100) COMMENT '固定端口', controller_cache_board varchar(100) COMMENT '板卡', controller_slot_number varchar(10) NOT NULL COMMENT '槽位号', FOREIGN KEY (storage_controller_id) REFERENCES biz_st_storage_controller(id) ); -- 板卡表 CREATE TABLE biz_st_board ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, controller_id BIGINT UNSIGNED NOT NULL COMMENT '关联存储控制器', borad_format varchar(50) comment '板卡格式', ip VARCHAR(15) COMMENT '板卡IP', type VARCHAR(30) NOT NULL DEFAULT 'FC' COMMENT '板卡类型', board_ports VARCHAR(50) comment '板卡端口', board_speed VARCHAR(50) comment '板卡速率', FOREIGN KEY (controller_id) REFERENCES biz_st_controller(id) );
时间: 2025-08-07 16:05:39 AIGC 浏览: 31
<think>我们正在将MySQL的建表语句转换为PostgreSQL兼容的语法。需要注意两个数据库在数据类型、关键字、自增属性等方面的差异。
主要差异点:
1. 自增属性:MySQL使用AUTO_INCREMENT,而PostgreSQL使用SERIAL类型(或使用IDENTITY,在较新版本中推荐)。
2. 字符串类型:MySQL的VARCHAR在PostgreSQL中同样存在,但需要注意长度限制的语法(在PostgreSQL中VARCHAR(n)或TEXT)。
3. 注释:MySQL使用COMMENT,而PostgreSQL使用COMMENT ON。
4. 默认值:某些默认值可能不同,例如MySQL的CURRENT_TIMESTAMP,在PostgreSQL中也是可用的,但有时需要调整。
5. 索引和键:主键、外键的声明语法类似,但索引的创建可能需要单独语句。
6. 引擎选项:MySQL的ENGINE=InnoDB等选项在PostgreSQL中不需要,可以去掉。
7. 数据类型映射:
- TINYINT -> SMALLINT 或 BOOLEAN(如果是布尔类型)
- MEDIUMTEXT -> TEXT
- DATETIME -> TIMESTAMP
- 等等
转换步骤:
1. 将AUTO_INCREMENT替换为SERIAL(但注意SERIAL在PostgreSQL中实际是整数类型+序列),或者使用GENERATED BY DEFAULT AS IDENTITY(PostgreSQL 10+)。
2. 去掉ENGINE=InnoDB等存储引擎声明。
3. 将数据类型进行映射(见上)。
4. 注释语句需要转换:将列注释或表注释改为PostgreSQL的COMMENT ON语句。
5. 检查关键字:某些在MySQL中不是关键字但在PostgreSQL中是关键字的,可能需要加引号或重命名(例如"user"表在PostgreSQL中可能需要加引号,因为USER是关键字)。
6. 索引:MySQL中在表定义中的索引(如KEY `index_name` (`column`))在PostgreSQL中需要单独写成CREATE INDEX语句(因为PostgreSQL不支持在CREATE TABLE中定义索引,除了主键和唯一约束)。
示例转换:
MySQL:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
PostgreSQL:
CREATE TABLE "user" (
id SERIAL PRIMARY KEY,
name VARCHAR(255) DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_name ON "user" (name);
注意:在PostgreSQL中,表名和列名默认是大小写不敏感的,除非使用双引号。在MySQL中,通常使用反引号,而PostgreSQL使用双引号。但为了兼容性,通常建议使用小写字母,避免使用关键字。
另外,关于自增,在PostgreSQL 10及以上版本,推荐使用IDENTITY列:
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
因此,上面的id列也可以写成:
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
但SERIAL更简洁,且被广泛使用。
如果原MySQL表中有外键约束,语法基本一致。
现在,请提供具体的MySQL建表语句,我们可以进行转换。</think>### MySQL建表语句转换为PostgreSQL语法指南
将MySQL建表语句转换为PostgreSQL需要处理以下关键差异:
#### 核心差异点
1. **自增字段**
- MySQL:`AUTO_INCREMENT`
- PostgreSQL:
```sql
column_name SERIAL PRIMARY KEY -- 传统方式
column_name INT GENERATED BY DEFAULT AS IDENTITY -- PostgreSQL 10+推荐
```
2. **数据类型映射**
| MySQL类型 | PostgreSQL等效类型 |
|----------------|-------------------|
| `TINYINT(1)` | `BOOLEAN` |
| `DATETIME` | `TIMESTAMP` |
| `TEXT` | `TEXT` |
| `VARCHAR(255)` | `VARCHAR(255)` |
| `MEDIUMTEXT` | `TEXT` |
3. **默认值差异**
- MySQL:`DEFAULT CURRENT_TIMESTAMP`
- PostgreSQL:`DEFAULT CURRENT_TIMESTAMP AT TIME ZONE 'UTC'`
4. **索引定义**
- MySQL:支持行内索引定义
- PostgreSQL:索引必须单独创建
#### 转换示例
**MySQL原始语句**:
```sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
is_active TINYINT(1) DEFAULT 1
) ENGINE=InnoDB;
```
**等效PostgreSQL语句**:
```sql
CREATE TABLE users (
id SERIAL PRIMARY KEY, -- 自增字段转换
username VARCHAR(50) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 时间类型转换
is_active BOOLEAN DEFAULT TRUE -- 布尔类型转换
);
-- 单独创建索引(PostgreSQL要求)
CREATE UNIQUE INDEX users_username_idx ON users (username);
```
#### 注意事项
1. **引号处理**
- 移除MySQL的反引号`` `column` ``
- 保留双引号`"column"`仅当使用保留关键字时
2. **表选项移除**
- 删除`ENGINE=InnoDB`、`DEFAULT CHARSET=utf8mb4`等MySQL特有选项
3. **外键约束**
```sql
-- MySQL
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
-- PostgreSQL语法相同,但需单独验证约束名唯一性
```
4. **注释迁移**
```sql
COMMENT ON COLUMN users.is_active IS '账户激活状态';
```
#### 自动转换工具
推荐使用开源工具进行批量转换:
1. [pgloader](https://pgloader.io/):支持直接迁移MySQL数据库
2. [SQLines](https://www.sqlines.com/online):在线SQL转换器
3. AWS Schema Conversion Tool:企业级数据库迁移工具
> 提示:转换后务必验证`EXPLAIN ANALYZE`执行计划,PostgreSQL的查询优化器与MySQL有显著差异[^1]。
阅读全文
相关推荐




















