mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
This feature adds the functionality of ignorability for indexes. Indexes are not ignored be default. To control index ignorability explicitly for a new index, use IGNORE or NOT IGNORE as part of the index definition for CREATE TABLE, CREATE INDEX, or ALTER TABLE. Primary keys (explicit or implicit) cannot be made ignorable. The table INFORMATION_SCHEMA.STATISTICS get a new column named IGNORED that would store whether an index needs to be ignored or not.
365 lines
11 KiB
Plaintext
365 lines
11 KiB
Plaintext
create table t1 (a int, b int, c int, d int, e int);
|
||
insert into t1 () values
|
||
(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),
|
||
(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),
|
||
(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),
|
||
(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),
|
||
(),(),(),();
|
||
select * into outfile 'load.data' from t1;
|
||
create temporary table tmp (a varchar(1024), b int, c int, d int, e linestring, unique (e));
|
||
load data infile 'load.data' into table tmp;
|
||
delete from tmp;
|
||
drop table t1;
|
||
drop table tmp;
|
||
create table t1 (b blob) engine=innodb;
|
||
alter table t1 add unique (b);
|
||
alter table t1 force;
|
||
show create table t1;
|
||
Table Create Table
|
||
t1 CREATE TABLE `t1` (
|
||
`b` blob DEFAULT NULL,
|
||
UNIQUE KEY `b` (`b`) USING HASH
|
||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||
drop table t1;
|
||
create table t1 (pk int, b blob, primary key(pk), unique(b)) engine=myisam;
|
||
insert into t1 values (1,'foo');
|
||
replace into t1 (pk) values (1);
|
||
alter table t1 force;
|
||
replace into t1 (pk) values (1);
|
||
drop table t1;
|
||
create table t1 (t time, unique(t)) engine=innodb;
|
||
insert into t1 values (null),(null);
|
||
alter ignore table t1 modify t text not null default '';
|
||
Warnings:
|
||
Warning 1265 Data truncated for column 't' at row 1
|
||
Warning 1265 Data truncated for column 't' at row 2
|
||
drop table t1;
|
||
create table t1 ( pk int, f text, primary key (pk), unique(f)) with system versioning;
|
||
insert into t1 values (1,'foo');
|
||
update t1 set f = 'bar';
|
||
select * from t1;
|
||
pk f
|
||
1 bar
|
||
update t1 set f = 'foo';
|
||
select * from t1;
|
||
pk f
|
||
1 foo
|
||
select pk, f, row_end > DATE'2030-01-01' from t1 for system_time all;
|
||
pk f row_end > DATE'2030-01-01'
|
||
1 foo 1
|
||
1 foo 0
|
||
1 bar 0
|
||
drop table t1;
|
||
create temporary table t1 (f blob, unique(f)) engine=innodb;
|
||
insert into t1 values (1);
|
||
replace into t1 values (1);
|
||
drop table t1;
|
||
create table t (b blob, unique(b)) engine=myisam;
|
||
insert into t values ('foo');
|
||
replace into t values ('foo');
|
||
drop table t;
|
||
CREATE TABLE t1 (f INT, x BLOB, UNIQUE (x));
|
||
INSERT INTO t1 VALUES (1,'foo');
|
||
ALTER TABLE t1 DROP x, ALGORITHM=INPLACE;
|
||
ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY
|
||
UPDATE t1 SET x = 'bar';
|
||
DROP TABLE t1;
|
||
create table t1(a blob unique , b blob);
|
||
insert into t1 values(1,1),(2,1);
|
||
alter table t1 add unique(b);
|
||
ERROR 23000: Duplicate entry '1' for key 'b'
|
||
show keys from t1;;
|
||
Table t1
|
||
Non_unique 0
|
||
Key_name a
|
||
Seq_in_index 1
|
||
Column_name a
|
||
Collation A
|
||
Cardinality NULL
|
||
Sub_part NULL
|
||
Packed NULL
|
||
Null YES
|
||
Index_type HASH
|
||
Comment
|
||
Index_comment
|
||
Ignored NO
|
||
insert into t1 values(1,1);
|
||
ERROR 23000: Duplicate entry '1' for key 'a'
|
||
DROP TABLE t1;
|
||
CREATE TABLE t1 (a TEXT, b INT, UNIQUE(a)) ENGINE=MyISAM;
|
||
ALTER TABLE t1 DROP x;
|
||
ERROR 42000: Can't DROP COLUMN `x`; check that it exists
|
||
UPDATE t1 SET b = 0 WHERE a = 'foo';
|
||
DROP TABLE t1;
|
||
CREATE TABLE t1 (a TEXT, b INT, UNIQUE(a)) ENGINE=InnoDB;
|
||
ALTER TABLE t1 DROP x;
|
||
ERROR 42000: Can't DROP COLUMN `x`; check that it exists
|
||
UPDATE t1 SET b = 0 WHERE a = 'foo';
|
||
DROP TABLE t1;
|
||
CREATE TEMPORARY TABLE t1 (f BLOB, UNIQUE(f)) ENGINE=InnoDB ROW_FORMAT=COMPACT;
|
||
ALTER TABLE t1 ADD KEY (f);
|
||
ERROR HY000: Index column size too large. The maximum column size is 767 bytes
|
||
TRUNCATE TABLE t1;
|
||
SELECT * FROM t1 WHERE f LIKE 'foo';
|
||
f
|
||
DROP TABLE t1;
|
||
CREATE TABLE t1 (a INT, UNIQUE ind USING HASH (a)) ENGINE=InnoDB;
|
||
ALTER TABLE t1 CHANGE COLUMN IF EXISTS b a INT;
|
||
Warnings:
|
||
Note 1054 Unknown column 'b' in 't1'
|
||
DROP TABLE t1;
|
||
CREATE TABLE t1 (f VARCHAR(4096), UNIQUE(f)) ENGINE=InnoDB;
|
||
ALTER TABLE t1 DROP x;
|
||
ERROR 42000: Can't DROP COLUMN `x`; check that it exists
|
||
SELECT * FROM t1 WHERE f LIKE 'foo';
|
||
f
|
||
DROP TABLE t1;
|
||
CREATE TABLE t1 (pk INT, PRIMARY KEY USING HASH (pk)) ENGINE=InnoDB;
|
||
show keys from t1;;
|
||
Table t1
|
||
Non_unique 0
|
||
Key_name PRIMARY
|
||
Seq_in_index 1
|
||
Column_name pk
|
||
Collation A
|
||
Cardinality 0
|
||
Sub_part NULL
|
||
Packed NULL
|
||
Null
|
||
Index_type BTREE
|
||
Comment
|
||
Index_comment
|
||
Ignored NO
|
||
ALTER TABLE t1 ADD INDEX (pk);
|
||
DROP TABLE t1;
|
||
CREATE TABLE t1 (b int, a varchar(4000));
|
||
INSERT INTO t1 VALUES (1, 2),(2,3),(3,4);
|
||
ALTER TABLE t1 ADD UNIQUE INDEX (a);
|
||
SELECT * FROM t1;
|
||
b a
|
||
1 2
|
||
2 3
|
||
3 4
|
||
SELECT a FROM t1;
|
||
a
|
||
2
|
||
3
|
||
4
|
||
drop table t1;
|
||
CREATE TABLE t1 (f VARCHAR(4096), UNIQUE(f)) ENGINE=InnoDB;
|
||
ALTER TABLE t1 DROP KEY f, ADD INDEX idx1(f), ALGORITHM=INSTANT;
|
||
ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: ADD INDEX. Try ALGORITHM=NOCOPY
|
||
ALTER TABLE t1 ADD KEY idx2(f);
|
||
Warnings:
|
||
Note 1071 Specified key was too long; max key length is 3072 bytes
|
||
DROP TABLE t1;
|
||
CREATE TABLE t1(a blob , b blob , unique(a,b));
|
||
alter table t1 drop column b;
|
||
ERROR 42000: Key column 'b' doesn't exist in table
|
||
insert into t1 values(1,1);
|
||
insert into t1 values(1,1);
|
||
ERROR 23000: Duplicate entry '1-1' for key 'a'
|
||
alter table t1 add column c int;
|
||
drop table t1;
|
||
create table t1(a blob , b blob as (a) unique);
|
||
insert into t1 values(1, default);
|
||
insert into t1 values(1, default);
|
||
ERROR 23000: Duplicate entry '1' for key 'b'
|
||
drop table t1;
|
||
create table t1(a blob, b blob, c blob as (left(a, 5000)) virtual, d blob as (left(b, 5000)) persistent, unique(a,b(4000)));
|
||
insert into t1(a,b) values(10,11);
|
||
insert into t1(a,b) values(10,11);
|
||
ERROR 23000: Duplicate entry '10-11' for key 'a'
|
||
insert into t1(a,b) values(2,2);
|
||
insert into t1(a,b) values(2,3);
|
||
insert into t1(a,b) values(3,2);
|
||
drop table t1;
|
||
CREATE TABLE t1 (
|
||
a CHAR(128),
|
||
b CHAR(128) AS (a),
|
||
c DATETIME,
|
||
UNIQUE(c,b(64))
|
||
) ENGINE=InnoDB;
|
||
ALTER TABLE t1 MODIFY COLUMN c VARCHAR(4096);
|
||
drop table t1;
|
||
CREATE TABLE t1 (
|
||
a CHAR(128),
|
||
b CHAR(128) AS (a),
|
||
c varchar(5000),
|
||
UNIQUE(c,b(64))
|
||
) ENGINE=InnoDB;
|
||
drop table t1;
|
||
CREATE TABLE t1 (data VARCHAR(4), unique(data) using hash) with system versioning;
|
||
INSERT INTO t1 VALUES ('A');
|
||
SELECT * INTO OUTFILE 'load.data' from t1;
|
||
LOAD DATA INFILE 'load.data' INTO TABLE t1;
|
||
ERROR 23000: Duplicate entry 'A' for key 'data'
|
||
select * from t1;
|
||
data
|
||
A
|
||
DROP TABLE t1;
|
||
CREATE TABLE t1 (data VARCHAR(7961)) ENGINE=InnoDB;
|
||
INSERT INTO t1 VALUES ('f'), ('o'), ('o');
|
||
SELECT * INTO OUTFILE 'load.data' from t1;
|
||
ALTER IGNORE TABLE t1 ADD UNIQUE INDEX (data);
|
||
SELECT * FROM t1;
|
||
data
|
||
f
|
||
o
|
||
ALTER TABLE t1 ADD SYSTEM VERSIONING ;
|
||
SELECT * FROM t1;
|
||
data
|
||
f
|
||
o
|
||
REPLACE INTO t1 VALUES ('f'), ('o'), ('o');
|
||
SELECT * FROM t1;
|
||
data
|
||
f
|
||
o
|
||
LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1;
|
||
SELECT * FROM t1;
|
||
data
|
||
f
|
||
o
|
||
DROP TABLE t1;
|
||
create table t1 (
|
||
c char(10) character set utf8mb4,
|
||
unique key a using hash (c(1))
|
||
) engine=myisam;
|
||
show create table t1;
|
||
Table Create Table
|
||
t1 CREATE TABLE `t1` (
|
||
`c` char(10) CHARACTER SET utf8mb4 DEFAULT NULL,
|
||
UNIQUE KEY `a` (`c`(1)) USING HASH
|
||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||
insert into t1 values ('б');
|
||
insert into t1 values ('бб');
|
||
ERROR 23000: Duplicate entry '<27>' for key 'a'
|
||
insert into t1 values ('ббб');
|
||
ERROR 23000: Duplicate entry '<27>' for key 'a'
|
||
drop table t1;
|
||
CREATE TABLE t1 (a INT, UNIQUE USING HASH (a)) PARTITION BY HASH (a) PARTITIONS 2;
|
||
INSERT INTO t1 VALUES (2);
|
||
REPLACE INTO t1 VALUES (2);
|
||
DROP TABLE t1;
|
||
set innodb_lock_wait_timeout= 10;
|
||
CREATE TABLE t1 (
|
||
id int primary key,
|
||
f INT unique
|
||
) ENGINE=InnoDB;
|
||
CREATE TABLE t2 (
|
||
id int primary key,
|
||
a blob unique
|
||
) ENGINE=InnoDB;
|
||
START TRANSACTION;
|
||
connect con1,localhost,root,,test;
|
||
connection con1;
|
||
set innodb_lock_wait_timeout= 10;
|
||
START TRANSACTION;
|
||
INSERT INTO t1 VALUES (1,1)/*1*/;
|
||
connection default;
|
||
INSERT INTO t2 VALUES (2, 1)/*2*/ ;
|
||
connection con1;
|
||
INSERT INTO t2 VALUES (3, 1)/*3*/;
|
||
connection default;
|
||
INSERT IGNORE INTO t1 VALUES (4, 1)/*4*/;
|
||
connection con1;
|
||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||
disconnect con1;
|
||
connection default;
|
||
DROP TABLE t1, t2;
|
||
CREATE TABLE t1 (a TEXT, UNIQUE(a)) ENGINE=Aria;
|
||
ERROR 42000: Specified key was too long; max key length is 2000 bytes
|
||
create table t1(a int, unique(a) using hash);
|
||
#BULK insert > 100 rows (MI_MIN_ROWS_TO_DISABLE_INDEXES)
|
||
drop table t1;
|
||
SET binlog_row_image= NOBLOB;
|
||
CREATE TABLE t1 (pk INT PRIMARY KEY, a text ,UNIQUE(a) using hash);
|
||
INSERT INTO t1 VALUES (1,'foo');
|
||
create table t2(id int primary key, a blob, b varchar(20) as (LEFT(a,2)));
|
||
INSERT INTO t2 VALUES (1, 'foo', default);
|
||
DROP TABLE t1, t2;
|
||
SET binlog_row_image= FULL;
|
||
CREATE TABLE t1 (a int, b VARCHAR(1000), UNIQUE (a,b)) ENGINE=MyISAM;
|
||
show index from t1;
|
||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored
|
||
t1 0 a 1 a A NULL NULL NULL YES HASH NO
|
||
t1 0 a 2 b A NULL NULL NULL YES HASH NO
|
||
CREATE TABLE t2 (a varchar(900), b VARCHAR(900), UNIQUE (a,b)) ENGINE=MyISAM;
|
||
show index from t2;
|
||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored
|
||
t2 0 a 1 a A NULL NULL NULL YES HASH NO
|
||
t2 0 a 2 b A NULL NULL NULL YES HASH NO
|
||
DROP TABLE t1,t2;
|
||
create temporary table tmp ( a int, b int, c blob not null, d int, e int default 0, f int, unique key (c)) engine=innodb;
|
||
create table t2 (x int);
|
||
lock table t2 write;
|
||
update tmp set c = 'foo';
|
||
start transaction;
|
||
alter table tmp alter column a set default 8;
|
||
unlock tables;
|
||
drop table t2;
|
||
create table t1 (pk int primary key, f blob, unique(f)) engine=innodb;
|
||
insert t1 values (1, null);
|
||
select * into outfile 't1.data' from t1;
|
||
load data infile 't1.data' replace into table t1;
|
||
select * from t1;
|
||
pk f
|
||
1 NULL
|
||
drop table t1;
|
||
create table t1 (a int, b blob) engine=myisam;
|
||
insert t1 values (1,'foo'),(2,'bar'), (3, 'bar');
|
||
create table t2 (c int, d blob, unique(d)) engine=myisam;
|
||
insert t2 select * from t1;
|
||
ERROR 23000: Duplicate entry 'bar' for key 'd'
|
||
select * from t2;
|
||
c d
|
||
1 foo
|
||
2 bar
|
||
insert ignore t2 select * from t1;
|
||
Warnings:
|
||
Warning 1062 Duplicate entry 'foo' for key 'd'
|
||
Warning 1062 Duplicate entry 'bar' for key 'd'
|
||
Warning 1062 Duplicate entry 'bar' for key 'd'
|
||
select * from t2;
|
||
c d
|
||
1 foo
|
||
2 bar
|
||
replace t2 select * from t1;
|
||
select * from t2;
|
||
c d
|
||
1 foo
|
||
3 bar
|
||
update t1, t2 set t2.d='off' where t1.a=t2.c and t1.b='foo';
|
||
select * from t2;
|
||
c d
|
||
1 off
|
||
3 bar
|
||
alter table t2 add system versioning;
|
||
delete from t2 using t1, t2 where t1.a=t2.c and t1.b='foo';
|
||
select * from t2;
|
||
c d
|
||
3 bar
|
||
create or replace table t2 (a int, b blob, unique(b)) as select * from t1;
|
||
ERROR 23000: Duplicate entry 'bar' for key 'b'
|
||
select * from t2;
|
||
ERROR 42S02: Table 'test.t2' doesn't exist
|
||
create or replace table t2 (a int, b blob, unique(b)) ignore as select * from t1;
|
||
Warnings:
|
||
Warning 1062 Duplicate entry 'bar' for key 'b'
|
||
select * from t2;
|
||
a b
|
||
1 foo
|
||
2 bar
|
||
create or replace table t2 (a int, b blob, unique(b)) replace as select * from t1;
|
||
select * from t2;
|
||
a b
|
||
1 foo
|
||
3 bar
|
||
drop table if exists t1, t2;
|
||
create table t1 (a int, b int, unique (b) using hash) engine=innodb partition by key (a) partitions 2;
|
||
insert into t1 values (1,10),(2,20);
|
||
update t1 set b = 30 limit 1;
|
||
drop table t1;
|
||
# End of 10.5 tests
|