mysql - mysql perl 脚本中唯一键错误为重复键

标签 mysql perl

我有一个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 默认字符集=latin1;

两个表之间的唯一区别是:

引擎=InnoDB默认字符集=utf8 COLLATE=utf8_bin; DB1

引擎=InnoDB默认字符集=latin1; DB2

最佳答案

两行不能具有相同的主键。 看来您有两行 CONN_ID = 10560 和 PWORD = ???在您的数据集中。

删除主键或清理数据(删除具有相同主键的行)。

问题的另一个可能原因是SELECT *INSERT INTO db1 VALUES ...。您应该始终为要检索和插入的列命名,以避免出现列顺序等问题。

我看到表架构有

PRIMARY KEY (`CONN_ID`,`KEYWORD`)

这与

不同
PRIMARY KEY (`CONN_ID`,`PWORD`)

PS:这个问题实际上与 Perl 无关。

关于mysql - mysql perl 脚本中唯一键错误为重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35309504/

相关文章:

PHP 读取以 utf8_unicode_ci 编码的 mysql 数据

正则表达式非贪婪地匹配多行直到以特定字符串开头的行

java - Perl 转义引号问题

perl - IPC::运行失败 -harness() 参数 3 中出现意外的标量

perl - 在 Unix shell 脚本中匹配 2 个模式后追加一行

php - 如何仅查询之前(月和年)的日期? (拉拉维尔)

mysql - 在sql查询中分配自定义行值

php - 如何从 Amazon CloudSearch 中的表字段中获取不同的记录

perl - Moose,Try::Tiny和TryCatch的奇怪行为

MySQL - 将两行连接到两列