我有一个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' )
我不知道现在该怎么想,除了驱动程序假设第一个提供的字段始终是递增的主键?
答案 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' )
如果将文本列移到顶部,问题就解决了。