SQLServer数据迁移到Mysql表和字段comment丢失批量添加方法

SQLServer数据迁移到Mysql表和字段comment丢失批量添加方法

第一步是用navicat将数据库迁移到MySQL过程自己百度吧。。

第二步 迁移完成之后 SQL Server 源库中执行,将所有表注解生成sql语句,将生成的sql语句在Mysql中执行,所有表注解批量修改成功

SELECT 'alter table ' + d.name + ' comment ''' + convert(varchar(20),isnull(f.value,''),120)    +''';'
FROM  
  sysobjects d
right join  
sys.extended_properties f
on  
  d.id=f.major_id and f.minor_id=0
where d.name is not null 

  

第三步 批量添加字段注解

SELECT  
  sql语句='select CONCAT(''alter table ' + d.name + ' modify column `' + a.name + '` '',  column_type , '' comment '''''+ convert(varchar(20), isnull(g.[value],'''

<think>好的,我现在要仔细分析用户的问题,他想了解SQL ServerMySQL在创建语法上的差异。首先,我需要回忆之前提供的解决方案中提到的外键约束、存储引擎等部分,结合用户现在引用的资料,特别是引用[1]、[2]、[3]中的内容,这些资料提到了两种数据库在关键字、语句结束符、外键处理等方面的不同。 用户之前的问题是关于创建带有外键约束的,现在他想扩展到更广泛的创建语法差异。我需要系统地比较两种数据库在数据类型、主键自增、外键约束、存储引擎、默认值注释等方面的不同。要注意用户可能实际应用中的常见问题,比如自增属性的不同关键字,或者外键删除语法的差异。 需要确保覆盖用户提到的引用内容,例如引用[1]中提到的MODIFYCHANGE关键字在SQL Server不存在,以及语句结束符的不同。引用[3]提到删除外键约束的不同语法,这也需要在创建时的外键定义部分进行比较。 同时,结合之前的回答,用户可能已经了解外键需要InnoDB引擎,但在SQL Server中可能不需要指定引擎,这也是一个关键点。另外,默认字符集校对规则的不同,以及注释添加方式,也是需要提到的差异。 还要考虑用户可能没有提到的其他差异,比如临时的创建方式、索引的定义位置等,但根据用户当前的问题,可能不需要深入这些细节,但如果有显著区别也应简要提及。 最后,要组织这些信息,结构清晰,分点说明,可能使用格对比,确保用户能直观理解两者的差异。同时,提供示例代码,帮助用户实际应用时参考。还要注意使用正确的中文术语,避免技术术语混淆,保持回答的易懂性。</think>### SQL Server 与 MySQL 创建语法差异详解 以下是两者在创建时的核心语法差异对比(基于用户提供的引用内容及实际语法规范): --- #### 一、**基础语法差异** | 特性 | MySQL | SQL Server | |---------------------|-----------------------------------------------------------------------|----------------------------------------------------------------------------| | **语句结束符** | 必须用`;` | 可用`GO`分隔批处理语句,单条语句末尾可不写分号[^1] | | **标识符引用符** | 使用反引号 `` ` ``(如包含特殊字符) | 使用方括号 `[]` | | **默认存储引擎** | 需显式指定`ENGINE=InnoDB`以支持外键 | 默认使用支持外键的引擎,无需声明 | | **字符集声明** | `DEFAULT CHARSET=utf8mb4` | 通常在数据库级别设置,建时无需指定 | --- #### 二、**核心功能实现差异** ##### 1. **自增字段** - **MySQL** 使用`AUTO_INCREMENT`,且必须与主键组合: ```sql CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) ); ``` - **SQL Server** 使用`IDENTITY(1,1)`,可独立使用: ```sql CREATE TABLE users ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(50) ); ``` ##### 2. **外键约束** - **MySQL** - 必须使用`FOREIGN KEY ... REFERENCES`显式声明 - 外键字段需与主字段**类型完全一致**(包括`UNSIGNED`)[^4] ```sql CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ) ENGINE=InnoDB; ``` - **SQL Server** - 允许在字段后直接声明外键(可选语法) - 外键类型只需兼容,无需完全一致 ```sql CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT REFERENCES users(id) ON DELETE CASCADE ); ``` ##### 3. **字段注释** - **MySQL** 使用`COMMENT`关键字: ```sql CREATE TABLE products ( id INT COMMENT '商品ID' ); ``` - **SQL Server** 需通过`EXEC sp_addextendedproperty`存储过程添加注释: ```sql EXEC sp_addextendedproperty 'MS_Description', '商品ID', 'SCHEMA', 'dbo', 'TABLE', 'products', 'COLUMN', 'id'; ``` ##### 4. **默认值与系统函数** | 功能 | MySQL | SQL Server | |-------------------|---------------------------|---------------------------| | **当前时间戳** | `DEFAULT CURRENT_TIMESTAMP` | `DEFAULT GETDATE()` | | **随机数** | `RAND()` | `NEWID()` 或 `RAND()` | | **自动更新字段** | `ON UPDATE CURRENT_TIMESTAMP` | 需通过触发器实现 | --- #### 三、**数据类型差异** | 数据类型 | MySQL | SQL Server | |-------------------|-----------------------|-------------------------| | **布尔类型** | `BOOLEAN`(TINYINT别名) | `BIT` | | **长文本** | `LONGTEXT` | `VARCHAR(MAX)` | | **二进制大对象** | `LONGBLOB` | `VARBINARY(MAX)` | | **无符号整数** | `INT UNSIGNED` | 不支持,需用更大类型替代 | --- #### 四、**其他关键差异** 1. **临时** - MySQL:`CREATE TEMPORARY TABLE temp1 (...)` - SQL Server:`CREATE TABLE #temp1 (...)` 2. **索引定义** - MySQL支持在定义中直接声明索引: ```sql CREATE TABLE t ( id INT, INDEX idx_id (id) ); ``` - SQL Server需通过`CREATE INDEX`语句单独创建。 3. **约束命名** - MySQL自动生成外键约束名(如未显式指定) - SQL Server推荐显式命名以避免冲突: ```sql FOREIGN KEY (user_id) REFERENCES users(id) CONSTRAINT fk_orders_users ON DELETE CASCADE ``` --- ### 示例对比 **创建学生(含自增主键外键)** - **MySQL** ```sql CREATE TABLE students ( sid INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, class_id INT UNSIGNED, FOREIGN KEY (class_id) REFERENCES classes(cid) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` - **SQL Server** ```sql CREATE TABLE students ( sid INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(50) NOT NULL, class_id INT, CONSTRAINT fk_students_class FOREIGN KEY (class_id) REFERENCES classes(cid) ON DELETE SET NULL ); ``` --- ### 常见问题场景 1. **迁移结构时自增字段如何处理?** - MySQL的`AUTO_INCREMENT`需改为SQL Server的`IDENTITY` - 注意SQL Server的`IDENTITY`种子增量设置(如`IDENTITY(100,2)`示从100开始,每次+2) 2. **外键约束删除时的差异** - MySQL:`ALTER TABLE orders DROP FOREIGN KEY fk_name`[^3] - SQL Server:`ALTER TABLE orders DROP CONSTRAINT fk_name` 3. **如何统一字符集?** - MySQL需在建时指定`DEFAULT CHARSET` - SQL Server通常在数据库创建时设置`COLLATE`参数 --- ### 流程图解(语法选择逻辑) ```mermaid graph TD A[开始建] --> B{选择数据库类型} B -->|MySQL| C[检查存储引擎是否为InnoDB] B -->|SQL Server| D[无需指定存储引擎] C --> E[定义自增字段用AUTO_INCREMENT] D --> F[定义自增字段用IDENTITY] E --> G[显式声明外键约束] F --> G G --> H[结束] ``` --- ### 相关问题 1. 如何将MySQL结构迁移到SQL Server? 2. 在SQL Server中如何实现类似MySQL的`ON UPDATE CURRENT_TIMESTAMP`功能? 3. 两种数据库的索引优化策略有何不同?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值