mirror of
https://github.com/MariaDB/server.git
synced 2025-08-23 03:54:27 +03:00
There is several different ways to incorrectly define foreign key constraint. In many cases earlier MariaDB versions the error messages produced by these cases are not very clear and helpful. This patch improves the warning messages produced by foreign key parsing.
131 lines
4.0 KiB
Plaintext
131 lines
4.0 KiB
Plaintext
--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;
|