INSERT INTO第一列链接服务器MS SQL - > MySQL总是空字符串

时间:2010-12-07 21:11:02

标签: sql mysql sql-server

我有一个MS SQL 2005服务器,它使用ODBC Connector 5.1.8驱动程序与MySQL 5.1.46服务器建立链接服务器连接。

我希望,从MS SQL作业中,根据相同结构的本地MS SQL表中包含的记录,截断然后重建远程MySQL表。

Key_ID  varchar(10)  NOT NULL  Primary
FieldA  varchar(64)
FieldB  text

Key_ID   FieldA   FieldB
======   ======   ======
ID1      A        A
ID2      B        B
ID3      C        C

问题是,当我从MS SQL运行以下查询时,我收到一条错误,指出“重复条目''用于密钥'PRIMARY'。”如果我删除主键,它将添加所有记录,但远程MySQL Key_ID字段始终返回空字符串,即使本地表中没有记录为NULL或空字符串。

EXECUTE ('DELETE FROM DB1.Table1') AT REMOTESERVER

INSERT INTO
 OPENQUERY( REMOTESERVER, 'SELECT * FROM DB1.Table1' )
SELECT
 Key_ID,
 FieldA,
 FieldB
FROM
 Table1

返回

Key_ID   FieldA   FieldB
======   ======   ======
         A        A
         B        B
         C        C

这绝对没有意义。

如果我在远程MySQL表的开头添加一个虚拟字段,然后修改我的查询以在其中插入一个文字值或NULL,该字段总是以空字符串形式出现,我的Key_ID字段按预期返回。 / p>

Dummy   varchar(64)
Key_ID  varchar(10)  NOT NULL  Primary
FieldA  varchar(64)
FieldB  text

EXECUTE ('DELETE FROM DB1.Table1') AT REMOTESERVER

INSERT INTO
 OPENQUERY( REMOTESERVER, 'SELECT * FROM DB1.Table1' )
SELECT
 'srsly wtf?',
 Key_ID,
 FieldA,
 FieldB
FROM
 Table1

返回

Dummy   Key_ID   FieldA   FieldB
=====   ======   ======   ======
        ID1      A        A
        ID2      B        B
        ID3      C        C

据我所知,最左边的第一列总是返回一个空字符串。有没有人知道为什么,或者可以给我一些不涉及虚拟字段的解决方法的想法,除了充当缓冲区之外没有任何目的?

更新: 我在ODBC驱动程序上启用了调试日志记录,并发现它将我的SQL语句转换为:

INSERT INTO `DB1`.`Table1` (`Key_ID`, `FieldA`, `FieldB`) VALUES ( DEFAULT, 'A', 'A' )

如果我添加虚拟字段,则运行:

INSERT INTO `DB1`.`Table1` (`Dummy`, `Key_ID`, `FieldA`, `FieldB`) VALUES ( DEFAULT, 'ID1', 'A', 'A' )

我不知道现在该怎么想,除了驱动程序假设第一个提供的字段始终是递增的主键?

4 个答案:

答案 0 :(得分:1)

我找到了自己问题的答案。

问题在于FieldB是一种文本数据类型。

我将MySQL Table1.FieldB从text更改为varchar,一切都按预期完成了。 (当然,我不得不截断原始MySQL表中的数据,但在我的情况下这并不是一件大事。)

令人困惑的部分是,即使在我重新定义数据类型之前,FieldB字段仍然正确插入,并且没有表明它的存在是问题。

答案 1 :(得分:1)

我刚遇到同样的问题,我认为问题与MySQL Text类型有关,作为表的最后一列。

假设我有下表:

CREATE TABLE `Test` (
  `id` int(11) NOT NULL DEFAULT '0',
  `field1` int(11) DEFAULT NULL,
  `field2` varchar(16) DEFAULT NULL,
  `field3` varchar(16) DEFAULT NULL,
  `field4` varchar(1) DEFAULT NULL,
  `field5` varchar(200) DEFAULT NULL,
  `field6` text,
  `field7` text,
  `field8` text,
  `field9` text,
  `field10` text,
  `field11` text,
  `field12` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在SQL Server上,我执行以下命令(test和db.dbo.test具有相同的模式):

INSERT OPENQUERY (MYSQL_LINK, 'SELECT * FROM test) SELECT * FROM db.dbo.test

然后id,field1到field5将变为NULL,field6到field12将具有正确的数据。

如果我执行以下操作:

INSERT OPENQUERY (MYSQL_LINK, 'SELECT id, field1, field2, field3, field4, field5 FROM test) SELECT id, field1, field2, field3, field4, field5 FROM db.dbo.test

然后id和field1到field5将拥有正确的数据。

如果我声称也插入了field6,则id将变为NULL。如果我插入field7,那么field2也将变为NULL,依此类推。

我一直在使用OPENQUERY将几十个MSSQL表传输到MySQL而没有任何问题。 在查看了其他表模式之后,我注意到它们都没有以MySQL中的TEXT类型结束。所以我通过在末尾添加一个整数列来对MySQL模式做了一点改动,然后瞧!它奏效了!

CREATE TABLE `Test_new` (
  `id` int(11) NOT NULL DEFAULT '0',
  `field1` int(11) DEFAULT NULL,
  `field2` varchar(16) DEFAULT NULL,
  `field3` varchar(16) DEFAULT NULL,
  `field4` varchar(1) DEFAULT NULL,
  `field5` varchar(200) DEFAULT NULL,
  `field6` text,
  `field7` text,
  `field8` text,
  `field9` text,
  `field10` text,
  `field11` text,
  `field12` text,
  `field13` int(11) NOT NULL DEFAULT '0',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

查询:

INSERT OPENQUERY (MYSQL_LINK, 'SELECT * FROM test_new') SELECT *,0 FROM db.dbo.test

我不知道应该在哪里解决这个问题。是MSSQL OPENQUERY错误还是MySQL Connector错误?我不知道。但我希望我的发现能帮助你们节省一些时间进行调试。

答案 2 :(得分:0)

如果更改

会发生什么
OPENQUERY( REMOTESERVER, 'SELECT * FROM DB1.Table1' ) 

声明

OPENQUERY( REMOTESERVER, 'SELECT Key_ID, FieldA, FieldB FROM DB1.Table1' ) 

答案 3 :(得分:0)

INSERT INTO `DB1`.`Table1` ( `FieldB`,`Dummy`, `Key_ID`, `FieldA`) VALUES ('A', DEFAULT, 'ID1', 'A' )

如果将文本列移到顶部,问题就解决了。