我有一个在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
?
这太奇怪了。
答案 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_table
和triggered_table
表的处理方式,您可能希望将触发器更改为使用REPLACE INTO
而不是INSERT INTO
。或者,您首先使用SELECT
进行检查,以查看是否需要添加新行。之后,您可以运行UPDATE
查询以更改update_date
的值。但是要回答您的问题,重复键错误来自triggered_table
表中的重复键。