mirror of
https://github.com/MariaDB/server.git
synced 2025-07-23 08:45:18 +03:00
Problem was that wrong error message was returned when insert returned FK-error and there was no duplicate key to process. row_ins If error from insert was DB_NO_REFERENCED_ROW and there was no duplicate key we should ignore ON DUPLICATE KEY UPDATE and return original error message.
87 lines
2.3 KiB
Plaintext
87 lines
2.3 KiB
Plaintext
--source include/have_innodb.inc
|
|
|
|
#
|
|
# MDEV-13206: INSERT ON DUPLICATE KEY UPDATE foreign key fail
|
|
#
|
|
set sql_mode='';
|
|
set innodb_strict_mode=0;
|
|
|
|
CREATE TABLE `v` (
|
|
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (`id`)
|
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
|
|
|
|
INSERT v values (1);
|
|
|
|
CREATE TABLE `vp` (
|
|
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
|
`v_id` int(10) unsigned NOT NULL,
|
|
`p_id` int(10) unsigned NOT NULL,
|
|
`ppp` varchar(255) NOT NULL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `IDX_vp_uniq` (`v_id`,`p_id`),
|
|
KEY `FK_vp_v` (`v_id`),
|
|
CONSTRAINT `FK_vp_v` FOREIGN KEY (`v_id`) REFERENCES `v` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
|
|
|
|
INSERT vp VALUES (12, 1, 100, 'text12');
|
|
INSERT INTO `vp` (`id`,`ppp`) VALUES (12, 'test12-2') ON DUPLICATE KEY UPDATE `ppp` = VALUES(`ppp`);
|
|
SELECT * FROM vp;
|
|
DROP TABLE vp, v;
|
|
|
|
CREATE TABLE t1 (i int PRIMARY KEY) ENGINE=InnoDB;
|
|
INSERT into t1 values (1);
|
|
|
|
CREATE TABLE t2 (
|
|
i int not null primary key,
|
|
vi int not null,
|
|
m int,
|
|
UNIQUE KEY (vi),
|
|
CONSTRAINT `cc` FOREIGN KEY (vi) REFERENCES t1 (i) ON DELETE CASCADE ON UPDATE CASCADE
|
|
) ENGINE=InnoDB;
|
|
|
|
INSERT into t2 VALUES (1, 1, 100);
|
|
INSERT INTO t2 (i,m) VALUES (1, 2) ON DUPLICATE KEY UPDATE m=3;
|
|
SELECT * FROM t2;
|
|
|
|
DROP TABLE t2,t1;
|
|
|
|
CREATE TABLE t1 (i int PRIMARY KEY) ENGINE=InnoDB;
|
|
INSERT into t1 values (1);
|
|
|
|
CREATE TABLE t2 (
|
|
i int not null primary key,
|
|
vi int not null,
|
|
m int,
|
|
KEY (vi),
|
|
CONSTRAINT `cc` FOREIGN KEY (vi) REFERENCES t1 (i) ON DELETE CASCADE ON UPDATE CASCADE
|
|
) ENGINE=InnoDB;
|
|
|
|
INSERT into t2 VALUES (1, 1, 100);
|
|
INSERT INTO t2 (i,m) VALUES (1, 2) ON DUPLICATE KEY UPDATE m=3;
|
|
SELECT * FROM t2;
|
|
DROP TABLE t2, t1;
|
|
|
|
#
|
|
# MDEV-15042: INSERT ON DUPLICATE KEY UPDATE produces error 1032 (Can't find record)
|
|
#
|
|
CREATE TABLE parent (
|
|
id INT PRIMARY KEY AUTO_INCREMENT
|
|
) ENGINE=INNODB;
|
|
|
|
CREATE TABLE child (
|
|
parent_id INT NOT NULL PRIMARY KEY,
|
|
id INT NOT NULL,
|
|
CONSTRAINT fk_c_parent FOREIGN KEY (parent_id) REFERENCES parent (id) ON UPDATE CASCADE ON DELETE CASCADE
|
|
) ENGINE=INNODB;
|
|
|
|
--error ER_NO_REFERENCED_ROW_2
|
|
INSERT INTO child (id, parent_id) VALUES (1, 1);
|
|
|
|
--error ER_NO_REFERENCED_ROW_2
|
|
INSERT INTO child (id, parent_id) VALUES (1, 1) ON DUPLICATE KEY UPDATE id = VALUES(id);
|
|
|
|
select * from parent;
|
|
select * from child;
|
|
drop table child, parent;
|