【问题标题】:ERROR 1062 (23000): Duplicate entry错误 1062 (23000):重复条目
【发布时间】:2017-11-28 19:03:23
【问题描述】:

我正在尝试将数据从 Oracle 表迁移到 MariaDB 表。我有来自 Oracle 表卸载的 csv 文件和一个加载脚本,用于将这些文件加载​​到相应的 mariadb 表中,这些表是我使用与 Oracle 端相同的表/模式定义创建的。我收到 1062 (230000) Duplicate entry 错误但是我不明白为什么 MySQL/Mariadb 将数据视为唯一的?插入的第一条记录中的值是小写的,而失败的第二条插入中的值是大写的。似乎 mysql 和 mariadb 都将值视为相同,因此我得到主键的重复输入错误。为了显示我的错误,我创建了一个测试表并手动尝试插入 2 行。我已将所有相关信息放在下面,如果有一些解释,我将不胜感激。提前感谢您的帮助。

MariaDB [mytestdb]>  create table test1 (id char(15) not null, recnum integer, primary key(id));

MariaDB [mytestdb]> show create table test1\G
*************************** 1. row ***************************
       Table: test1
Create Table: CREATE TABLE `test1` (
  `id` char(15) NOT NULL,
  `recnum` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

MariaDB [mytestdb]> insert into test1 values ('abc123',1);
Query OK, 1 row affected (0.01 sec)

MariaDB [mytestdb]> insert into test1 values ('ABC123',2);
ERROR 1062 (23000): Duplicate entry 'ABC123' for key 'PRIMARY'

谢谢, 桑杰

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    默认情况下,MySQL 不区分大小写。您应该使用适合数据类型的 COLLATION 选项 (*_cs) 之一定义列,或者如果不存在,则使用 _bin 排序规则。或者,如果所有其他方法都失败(例如,您的数据类型的 _cs 或 _bin 排序规则不存在),您可能需要将该列设置为 BINARY 字符集。

    作为起点,https://dev.mysql.com/doc/refman/5.7/en/charset-mysql.html 可能有用。

    【讨论】:

    • 乔恩,谢谢您的回复。我尝试使用 latin1_bin 作为 COLLATE 值,这在我的测试表中有效。我能够在我的示例中插入 2 行。我会在真正的桌子上试一试,因为我有信心它会起作用。谢谢和问候,桑杰
    • 别担心!请记住,如果您开始对该列进行连接查询,您已经这样做了:您需要确保字符集和排序规则匹配,否则 MySQL 有时会丢弃索引并进行全表扫描。
    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 2018-07-11
    • 1970-01-01
    相关资源
    最近更新 更多