我有一个sql表,它有主键,它是同一个表的两列的组合,如下所示:
PRIMARY KEY (`CONN_ID`,`PWORD`)
我正在使用perl脚本将数据从一个数据库迁移到另一个数据库。
$select = $dbh1->prepare("SELECT * FROM db2");
$insert = $dbh2->prepare("INSERT INTO db1 VALUES (?,?,?,?,?,?,?,?,?,?,?,?)");
$dbh2->do( 'SET FOREIGN_KEY_CHECKS=0;' );
$select->execute;
while ( my($PWORD,$CASE,$SPECIAL_XP,$ENA_TRANS,$TRANS,$DESC,$COMP,$SER,$CONN_ID,$S_ID,$EXT) = $select->fetchrow_array )
{
$insert->execute($PWORD,$CASE,$SPECIAL_XP,$ENA_TRANS,$TRANS,$DESC,$COMP,$SER,$CONN_ID,$S_ID,$EXT,'NULL');
}
$dbh2->do( 'SET FOREIGN_KEY_CHECKS=1;' );
在运行脚本时,我收到以下错误,如何克服该错误并复制数据,没有任何差异。
DBD::mysql::st execute failed: Duplicate entry '10560-???' for key 'PRIMARY' at ./upgrade.sh.
表架构:
CREATE TABLE `MDB_KEYWORD` (
`PWORD` varchar(255) NOT NULL,
`CASE` char(1) DEFAULT NULL,
`SPECIAL_XP` char(1) DEFAULT NULL,
`ENA_TRANS` char(1) DEFAULT NULL,
`TRANS` varchar(300) DEFAULT NULL,
`DESC` varchar(500) DEFAULT NULL,
`COMP` blob,
`SER` bigint(20) NOT NULL,
`CONN_ID` bigint(20) NOT NULL,
`S_ID` bigint(20) DEFAULT NULL,
`EXT` bigint(20) DEFAULT NULL,
`U_LIST` char(1) DEFAULT NULL,
PRIMARY KEY (`CONN_ID`,`KEYWORD`),
KEY `FK_KEYWORD_SERVICECONN` (`SER`),
KEY `FK_KEYWORD_SERVICE` (`S_ID`),
KEY `FK_KEYWORD_EXTID` (`EXT`),
CONSTRAINT `FK_KEYWORD_DRIVERCONN` FOREIGN KEY (`CONN_ID`) REFERENCES `PDB_PROFILE` (`PR_ID`),
CONSTRAINT `FK_KEYWORD_EXTID` FOREIGN KEY (`EXT_ID`) REFERENCES `PDB_PROFILE` (`PR_ID`),
CONSTRAINT `FK_KEYWORD_SERVICE` FOREIGN KEY (`S_ID`) REFERENCES `PDB_PROFILE` (`PR_ID`),
CONSTRAINT `FK_KEYWORD_SERVICECONN` FOREIGN KEY (`SER`) REFERENCES `PDB_PROFILE` (`PR_ID`)
)ENGINE = InnoDB DEFAULT CHARSET = latin1;
两个表之间的唯一区别是:
ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin; DB1
ENGINE = InnoDB DEFAULT CHARSET = latin1; DB2
答案 0 :(得分:0)
您不能拥有两个具有相同主键的行。 看来你有两行CONN_ID = 10560和PWORD = ???在您的数据集中。
删除主键或清理数据(删除具有相同主键的行)。
问题的另一个可能原因是SELECT *
和INSERT INTO db1 VALUES ...
。您应始终命名要检索和插入的列,以避免列顺序等问题。
我看到表架构有
PRIMARY KEY (`CONN_ID`,`KEYWORD`)
与
不同PRIMARY KEY (`CONN_ID`,`PWORD`)
PS:这个问题实际上与perl无关。