--source include/have_innodb.inc # # MDEV-8524: Improve error messaging when there is duplicate key or foreign key names # CREATE TABLE t1 ( id int(11) NOT NULL PRIMARY KEY, a int(11) NOT NULL, b int(11) NOT NULL, c int not null, CONSTRAINT test FOREIGN KEY (b) REFERENCES t1 (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; # # Below create table fails because constraint name test # is reserved for above table. # --error 1005 CREATE TABLE t2 ( id int(11) NOT NULL PRIMARY KEY, a int(11) NOT NULL, b int(11) NOT NULL, c int not null, CONSTRAINT mytest FOREIGN KEY (c) REFERENCES t1(id), CONSTRAINT test FOREIGN KEY (b) REFERENCES t2 (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; show warnings; drop table t1; # # MDEV-6697: Improve foreign keys warnings/errors # # # No index for referenced columns # create table t1(a int) engine=innodb; --error 1005 create table t2(a int, constraint a foreign key a (a) references t1(a)) engine=innodb; show warnings; drop table t1; create table t1(a int not null primary key, b int) engine=innodb; --error 1005 create table t2(a int, b int, constraint a foreign key a (a) references t1(a), constraint a foreign key a (a) references t1(b)) engine=innodb; show warnings; create table t2(a int, b int, constraint a foreign key a (a) references t1(a)) engine=innodb; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ --error 1005 alter table t2 add constraint b foreign key (b) references t2(b); --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ show warnings; drop table t2, t1; # # Referenced table does not exists # create table t1 (f1 integer primary key) engine=innodb; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ --error 1005 alter table t1 add constraint c1 foreign key (f1) references t11(f1); --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ show warnings; drop table t1; # # Foreign key on temporal tables # create temporary table t1(a int not null primary key, b int, key(b)) engine=innodb; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ --error 1005 create temporary table t2(a int, foreign key(a) references t1(a)) engine=innodb; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ show warnings; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ --error 1005 alter table t1 add foreign key(b) references t1(a); --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ show warnings; drop table t1; # # Column numbers do not match # create table t1(a int not null primary key, b int, key(b)) engine=innodb; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ --error 1005 alter table t1 add foreign key(a,b) references t1(a); --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ show warnings; drop table t1; create table t1(a int not null primary key, b int, key(b)) engine=innodb; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ --error 1005 alter table t1 add foreign key(a) references t1(a,b); --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ show warnings; drop table t1; # # ON UPDATE/DELETE SET NULL on NOT NULL column # create table t1 (f1 integer not null primary key) engine=innodb; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ --error 1005 alter table t1 add constraint c1 foreign key (f1) references t1(f1) on update set null; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ show warnings; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ --error 1005 create table t2(a int not null, foreign key(a) references t1(f1) on delete set null) engine=innodb; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ show warnings; drop table t1; # # Incorrect types # create table t1 (id int not null primary key, f1 int, f2 int, key(f1)) engine=innodb; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ --error 1005 create table t2(a char(20), key(a), foreign key(a) references t1(f1)) engine=innodb; --replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ show warnings; drop table t1;