将新值插入MySQL数据库时,键“ PRIMARY”的条目“ 111-222”重复

时间:2019-02-20 09:17:34

标签: mysql

我有一个在AWS RDS上运行的MySQL表,其结构如下:

CREATE TABLE `my_table` (
  `col1` int(11) NOT NULL,
  `col2` int(11) NOT NULL DEFAULT '0',
  `f_name` varchar(45) DEFAULT NULL,
  `l_name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`col1`,`col2`),
  KEY `idx_col1` (`col1`),
  KEY `idx_col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

查询

SELECT * FROM my_table WHERE col1=111 AND col2=222; 

返回0行。

但是当我运行插入查询

INSERT INTO my_table 
        (col1, col2, f_name, l_name) 
VALUES (111, 222, 'John', 'Doe')

我说错了

  

键“ PRIMARY”的条目“ 111-222”重复。

为什么会这样?该表不包含col1 = 111和col2 = 222的行。

已经存在一行,其值为col1 = 111,col2 = 111,f_name ='John'和l_name ='Doe'。但是我认为这不会导致重复的输入错误。

==========================编辑=================== ==================

有一个触发器会生成重复错误。这是重现该错误的脚本。

# Initialize the tables
CREATE TABLE `my_table` (
  `col1` int(11) NOT NULL,
  `col2` int(11) NOT NULL DEFAULT '0',
  `f_name` varchar(45) DEFAULT NULL,
  `l_name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`col1`,`col2`),
  KEY `idx_col1` (`col1`),
  KEY `idx_col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `triggered_table` (
  `col1` int(11) NOT NULL,
  `col2` int(11) NOT NULL DEFAULT '0',
  `update_date` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`col1`,`col2`),
  KEY `idx_col1` (`col1`),
  KEY `idx_col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# Insert the data that cause duplicate error
INSERT INTO triggered_table (col1, col2) VALUES (111, 222);

# Create the trigger
DELIMITER $$
CREATE TRIGGER weird_trigger AFTER INSERT
 ON my_table
 FOR EACH ROW
BEGIN
    INSERT INTO triggered_table 
    (col1, col2) 
    VALUES (NEW.col1, NEW.col2);
END$$
DELIMITER ;

# Create the duplicate error
INSERT INTO my_table 
        (col1, col2, f_name, l_name) 
VALUES (111, 222, 'John', 'Doe');

我真的不明白为什么开发人员创建了triggered_table表。他们为什么不将update_date列放到my_table

这太奇怪了。

2 个答案:

答案 0 :(得分:0)

您要做的就是:

Truncate您的表然后运行(假设您只有测试数据,如果没有,则必须先进行一些备份)

INSERT INTO my_table 
        (col1, col2, f_name, l_name) 
VALUES (111, 222, 'John', 'Doe')

现在,如果错误仍然存​​在,这将是一个很大的问题。

您的错误似乎是将col1和col2用作主键('111-222'

您可以尝试 select * from yourTable where FieldPrimary = '111-222'(如果已经存在)

答案 1 :(得分:0)

重复键错误不是来自my_table表,而是来自triggered_table表。当您在triggered_table中为键(111, 222)添加一行,然后在my_table表中添加新行(具有相同的键)时,触发器还将尝试添加新行用(111, 222)中的密钥triggered_table。但是,已经有这样的密钥在使用中,您将得到重复的密钥错误。

根据对my_tabletriggered_table表的处理方式,您可能希望将触发器更改为使用REPLACE INTO而不是INSERT INTO。或者,您首先使用SELECT进行检查,以查看是否需要添加新行。之后,您可以运行UPDATE查询以更改update_date的值。但是要回答您的问题,重复键错误来自triggered_table表中的重复键。