使用CData迁移SQL Server表至MariaDB时遇主键报错求助
解决CData迁移SQL Server表到MariaDB时的主键错误(1170)
错误原因
MariaDB规定,当TEXT/BLOB类型列(或被误识别为这类的列)作为主键时,必须指定索引长度。你的情况是CData在转换SQL Server的nvarchar(255)主键列时,没有正确传递长度信息,导致MariaDB将其识别为TEXT类型,触发1170错误。
解决办法
1. 手动预创建目标表
先在MariaDB中创建与源表结构完全匹配的表,明确指定列类型和主键:
CREATE TABLE table1 ( username VARCHAR(255) NOT NULL PRIMARY KEY, account_name VARCHAR(255), description VARCHAR(255), change_date DATE );
然后执行CData的REPLICATE命令,指定写入已存在的表:
REPLICATE [dbo].[table1] INTO table1;
这种方式跳过CData自动建表的步骤,从根源避免类型映射错误。
2. 调整CData的类型映射配置
修改CData连接MariaDB的配置,强制将SQL Server的nvarchar类型映射为MariaDB的带长度VARCHAR:
- 找到CData的配置文件(如
mariadb.cfg),添加或修改参数:DataTypeMapping=nvarchar=VARCHAR - 或者在连接字符串中直接指定:
jdbc:sqlserver://...;DataTypeMapping=nvarchar=VARCHAR;
这样CData会正确保留nvarchar的长度信息,建表时生成VARCHAR(255)而非TEXT类型。
3. 自定义REPLICATE命令的字段映射
如果CData支持,在REPLICATE命令中显式指定每个字段的类型,覆盖默认映射:
REPLICATE [dbo].[table1] ( username VARCHAR(255) PRIMARY KEY, account_name VARCHAR(255), description VARCHAR(255), change_date DATE ) INTO table1;
内容的提问来源于stack exchange,提问作者stackoverflowme
相关产品推荐
相关产品推荐

