mirror of
https://github.com/MariaDB/server.git
synced 2025-12-09 08:01:34 +03:00
- InnoDB DDL results in `Duplicate entry' if concurrent DML throws duplicate key error. The following scenario explains the problem connection con1: ALTER TABLE t1 FORCE; connection con2: INSERT INTO t1(pk, uk) VALUES (2, 2), (3, 2); In connection con2, InnoDB throws the 'DUPLICATE KEY' error because of unique index. Alter operation will throw the error when applying the concurrent DML log. - Inserting the duplicate key for unique index logs the insert operation for online ALTER TABLE. When insertion fails, transaction does rollback and it leads to logging of delete operation for online ALTER TABLE. While applying the insert log entries, alter operation encounters 'DUPLICATE KEY' error. - To avoid the above fake duplicate scenario, InnoDB should not write any log for online ALTER TABLE before DML transaction commit. - User thread which does DML can apply the online log if InnoDB ran out of online log and index is marked as completed. Set online log error if apply phase encountered any error. It can also clear all other indexes log, marks the newly added indexes as corrupted. - Removed the old online code which was a part of DML operations commit_inplace_alter_table() : Does apply the online log for the last batch of secondary index log and does frees the log for the completed index. trx_t::apply_online_log: Set to true while writing the undo log if the modified table has active DDL trx_t::apply_log(): Apply the DML changes to online DDL tables dict_table_t::is_active_ddl(): Returns true if the table has an active DDL dict_index_t::online_log_make_dummy(): Assign dummy value for clustered index online log to indicate the secondary indexes are being rebuild. dict_index_t::online_log_is_dummy(): Check whether the online log has dummy value ha_innobase_inplace_ctx::log_failure(): Handle the apply log failure for online DDL transaction row_log_mark_other_online_index_abort(): Clear out all other online index log after encountering the error during row_log_apply() row_log_get_error(): Get the error happened during row_log_apply() row_log_online_op(): Does apply the online log if index is completed and ran out of memory. Returns false if apply log fails UndorecApplier: Introduced a class to maintain the undo log record, latched undo buffer page, parse the undo log record, maintain the undo record type, info bits and update vector UndorecApplier::get_old_rec(): Get the correct version of the clustered index record that was modified by the current undo log record UndorecApplier::clear_undo_rec(): Clear the undo log related information after applying the undo log record UndorecApplier::log_update(): Handle the update, delete undo log and apply it on online indexes UndorecApplier::log_insert(): Handle the insert undo log and apply it on online indexes UndorecApplier::is_same(): Check whether the given roll pointer is generated by the current undo log record information trx_t::rollback_low(): Set apply_online_log for the transaction after partially rollbacked transaction has any active DDL prepare_inplace_alter_table_dict(): After allocating the online log, InnoDB does create fulltext common tables. Fulltext index doesn't allow the index to be online. So removed the dead code of online log removal Thanks to Marko Mäkelä for providing the initial prototype and Matthias Leich for testing the issue patiently.
337 lines
15 KiB
Plaintext
337 lines
15 KiB
Plaintext
CREATE TABLE t1(c1 INT NOT NULL, c2 INT, PRIMARY KEY(c1)) Engine=InnoDB;
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`c1` int(11) NOT NULL,
|
|
`c2` int(11) DEFAULT NULL,
|
|
PRIMARY KEY (`c1`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
|
INSERT INTO t1 VALUES (1,1),(2,2),(3,3),(4,4),(5,5);
|
|
SET @saved_debug_dbug = @@SESSION.debug_dbug;
|
|
SET DEBUG_DBUG='+d,ib_build_indexes_too_many_concurrent_trxs, ib_rename_indexes_too_many_concurrent_trxs, ib_drop_index_too_many_concurrent_trxs';
|
|
ALTER TABLE t1 ADD UNIQUE INDEX(c2);
|
|
ERROR HY000: Too many active concurrent transactions
|
|
SET DEBUG_DBUG = @saved_debug_dbug;
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`c1` int(11) NOT NULL,
|
|
`c2` int(11) DEFAULT NULL,
|
|
PRIMARY KEY (`c1`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
|
DROP TABLE t1;
|
|
CREATE TABLE bug13861218 (c1 INT NOT NULL, c2 INT NOT NULL, INDEX(c2))
|
|
ENGINE=InnoDB;
|
|
INSERT INTO bug13861218 VALUES (8, 0), (4, 0), (0, 0);
|
|
SET DEBUG_DBUG = '+d,ib_row_merge_buf_add_two';
|
|
CREATE UNIQUE INDEX ui ON bug13861218(c1);
|
|
SET DEBUG_DBUG = @saved_debug_dbug;
|
|
DROP TABLE bug13861218;
|
|
CREATE TABLE bug13861218 (c1 INT NOT NULL, c2 INT UNIQUE) ENGINE=InnoDB;
|
|
INSERT INTO bug13861218 VALUES (8, NULL), (4, NULL), (0, NULL);
|
|
SET DEBUG_DBUG = '+d,ib_row_merge_buf_add_two';
|
|
CREATE UNIQUE INDEX ui ON bug13861218(c1);
|
|
SET DEBUG_DBUG = @saved_debug_dbug;
|
|
DROP TABLE bug13861218;
|
|
#
|
|
# Bug #17657223 EXCESSIVE TEMPORARY FILE USAGE IN ALTER TABLE
|
|
#
|
|
create table t480(a serial)engine=innodb;
|
|
insert into t480
|
|
values(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),
|
|
(),(),(),(),(),(),(),();
|
|
insert into t480 select 0 from t480;
|
|
insert into t480 select 0 from t480;
|
|
insert into t480 select 0 from t480;
|
|
insert into t480 select 0 from t480;
|
|
create table t1(f1 int auto_increment not null,
|
|
f2 char(200) not null, f3 char(200) not null,
|
|
primary key(f1,f2,f3), key(f1))engine=innodb;
|
|
insert into t1 select NULL,'aaa','bbb' from t480;
|
|
insert into t1 select NULL,'aaaa','bbbb' from t480;
|
|
insert into t1 select NULL,'aaaaa','bbbbb' from t480;
|
|
insert into t1 select NULL,'aaaaaa','bbbbbb' from t480;
|
|
SET DEBUG_DBUG = '+d,row_merge_write_failure';
|
|
alter table t1 drop primary key,add primary key(f2,f1);
|
|
ERROR HY000: Temporary file write failure
|
|
SET DEBUG_DBUG = @saved_debug_dbug;
|
|
drop table t1;
|
|
connect con1,localhost,root;
|
|
create table t1(k1 int auto_increment primary key,
|
|
k2 char(200),k3 char(200))engine=innodb;
|
|
insert into t1 values(NULL,'a','b'), (NULL,'aa','bb');
|
|
SET DEBUG_SYNC= 'row_merge_after_scan
|
|
SIGNAL opened WAIT_FOR flushed';
|
|
optimize table t1;
|
|
connection default;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR opened';
|
|
INSERT INTO t1 select NULL,'aaa','bbb' from t480;
|
|
SET DEBUG_SYNC= 'now SIGNAL flushed';
|
|
connection con1;
|
|
/*con1 reap*/ Optimize table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
|
test.t1 optimize status OK
|
|
affected rows: 2
|
|
SELECT COUNT(k1),k2,k3 FROM t1 GROUP BY k2,k3;
|
|
COUNT(k1) k2 k3
|
|
1 a b
|
|
1 aa bb
|
|
480 aaa bbb
|
|
drop table t1;
|
|
create table t1(k1 int auto_increment primary key,
|
|
k2 char(200),k3 char(200))engine=innodb;
|
|
INSERT INTO t1 VALUES(1, "test", "test");
|
|
SET DEBUG_SYNC= 'row_merge_after_scan
|
|
SIGNAL opened WAIT_FOR flushed';
|
|
ALTER TABLE t1 FORCE, ADD COLUMN k4 int;
|
|
connection default;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR opened';
|
|
SET debug = '+d,row_log_tmpfile_fail';
|
|
Warnings:
|
|
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
|
|
INSERT INTO t1 select NULL,'aaa','bbb' from t480;
|
|
INSERT INTO t1 select NULL,'aaaa','bbbb' from t480;
|
|
SET DEBUG_SYNC= 'now SIGNAL flushed';
|
|
SET DEBUG_DBUG = @saved_debug_dbug;
|
|
connection con1;
|
|
/*con1 reap*/ ALTER TABLE t1 ADD COLUMN k4 int;
|
|
ERROR HY000: Out of memory.
|
|
SELECT COUNT(k1),k2,k3 FROM t1 GROUP BY k2,k3;
|
|
COUNT(k1) k2 k3
|
|
480 aaa bbb
|
|
480 aaaa bbbb
|
|
1 test test
|
|
disconnect con1;
|
|
connection default;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`k1` int(11) NOT NULL AUTO_INCREMENT,
|
|
`k2` char(200) DEFAULT NULL,
|
|
`k3` char(200) DEFAULT NULL,
|
|
PRIMARY KEY (`k1`)
|
|
) ENGINE=InnoDB AUTO_INCREMENT=1024 DEFAULT CHARSET=latin1
|
|
drop table t1;
|
|
drop table t480;
|
|
#
|
|
# MDEV-12827 Assertion failure when reporting duplicate key error
|
|
# in online table rebuild
|
|
#
|
|
CREATE TABLE t1 (j INT UNIQUE, i INT) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES(2, 2);
|
|
connect con1,localhost,root,,test;
|
|
SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL built WAIT_FOR log';
|
|
ALTER TABLE t1 DROP j, ADD UNIQUE INDEX(i), FORCE;
|
|
connection default;
|
|
SET DEBUG_SYNC='now WAIT_FOR built';
|
|
SET DEBUG_DBUG='+d,row_ins_row_level';
|
|
INSERT INTO t1 (i) VALUES (0),(0);
|
|
SET DEBUG_SYNC='now SIGNAL log';
|
|
SET DEBUG_DBUG=@saved_debug_dbug;
|
|
connection con1;
|
|
ERROR 23000: Duplicate entry '0' for key 'i'
|
|
DELETE FROM t1;
|
|
ALTER TABLE t1 ADD UNIQUE INDEX(i);
|
|
SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL built2 WAIT_FOR log2';
|
|
ALTER TABLE t1 DROP j, FORCE;
|
|
connection default;
|
|
SET DEBUG_SYNC='now WAIT_FOR built2';
|
|
INSERT INTO t1 (i) VALUES (0),(1);
|
|
UPDATE t1 SET i=0;
|
|
ERROR 23000: Duplicate entry '0' for key 'i'
|
|
SET DEBUG_SYNC='now SIGNAL log2';
|
|
connection con1;
|
|
disconnect con1;
|
|
connection default;
|
|
SET DEBUG_SYNC='RESET';
|
|
DROP TABLE t1;
|
|
SET DEBUG_SYNC='RESET';
|
|
#
|
|
# BUG#21612714 ALTER TABLE SORTING SKIPPED WHEN CHANGE PK AND DROP
|
|
# LAST COLUMN OF OLD PK
|
|
#
|
|
SET DEBUG_DBUG = '+d,innodb_alter_table_pk_assert_no_sort';
|
|
create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb;
|
|
insert into t1 values('abd'), ('acd');
|
|
alter table t1 drop primary key, add primary key(o1(3)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb;
|
|
insert into t1 values('abd'), ('acd');
|
|
alter table t1 drop primary key, add primary key(o1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb;
|
|
insert into t1 values('abd'), ('acd');
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1(3), n1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), primary key(o1(2))) engine = innodb;
|
|
insert into t1 values('abd'), ('acd');
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1, n1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int not null, primary key(o1(2))) engine = innodb;
|
|
insert into t1 values('abd', 1), ('acd', 2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1(3), o2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int not null, primary key(o1(2))) engine = innodb;
|
|
insert into t1 values('abd', 1), ('acd', 2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1, o2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), primary key(o1(3))) engine = innodb;
|
|
insert into t1 values('abd'), ('acd');
|
|
alter table t1 drop primary key, add primary key(o1(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), primary key(o1)) engine = innodb;
|
|
insert into t1 values('abd'), ('acd');
|
|
alter table t1 drop primary key, add primary key(o1(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb;
|
|
insert into t1 values('abd', 1), ('acd', 2);
|
|
alter table t1 drop primary key, add primary key(o1(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb;
|
|
insert into t1 values('abd', 1), ('acd', 2);
|
|
alter table t1 drop primary key, add primary key(o1(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb;
|
|
insert into t1 values('abd', 1), ('acd', 2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1(2),n1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb;
|
|
insert into t1 values('abd', 1), ('acd', 2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1(2),n1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int, primary key(o1(3), o2)) engine = innodb;
|
|
insert into t1 values('abd', 1), ('acd', 2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1(3),n1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int, primary key(o1, o2)) engine = innodb;
|
|
insert into t1 values('abd', 1), ('acd', 2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 varchar(10), primary key(o1,o2(3))) engine = innodb;
|
|
insert into t1 values(1,'abd'), (2,'acd');
|
|
alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 varchar(10), primary key(o1,o2)) engine = innodb;
|
|
insert into t1 values(1,'abd'), (2,'acd');
|
|
alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 varchar(10), primary key(o1,o2(2))) engine = innodb;
|
|
insert into t1 values(1, 'abd'), (2, 'acd');
|
|
alter table t1 drop primary key, add primary key(o1,o2(3)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 varchar(10), primary key(o1,o2(2))) engine = innodb;
|
|
insert into t1 values(1, 'abd'), (2, 'acd');
|
|
alter table t1 drop primary key, add primary key(o1,o2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2(3),o3)) engine = innodb;
|
|
insert into t1 values(1, 'abd', 1), (2, 'acd', 2);
|
|
alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 varchar(10), o3 int, primary key(o1,o2,o3)) engine = innodb;
|
|
insert into t1 values(1, 'abd', 1), (2, 'acd', 2);
|
|
alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(3))) engine = innodb;
|
|
insert into t1 values('abd', 'acd'), ('acd', 'abd');
|
|
alter table t1 drop primary key, add primary key(o1(3),o2(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2)) engine = innodb;
|
|
insert into t1 values('abd', 'acd'), ('acd', 'abd');
|
|
alter table t1 drop primary key, add primary key(o1,o2(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 varchar(10), primary key(o1(3),o2(2))) engine = innodb;
|
|
insert into t1 values('abd', 'acd'), ('acd', 'abd');
|
|
alter table t1 drop primary key, add primary key(o1(3),o2(3)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 varchar(10), primary key(o1,o2(2))) engine = innodb;
|
|
insert into t1 values('abd', 'acd'), ('acd', 'abd');
|
|
alter table t1 drop primary key, add primary key(o1,o2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1(3),o2,o3(2))) engine = innodb;
|
|
insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd');
|
|
alter table t1 drop primary key, add primary key(o1(3),o2,o3(3)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1,o2,o3(2))) engine = innodb;
|
|
insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd');
|
|
alter table t1 drop primary key, add primary key(o1,o2,o3), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1(3),o2,o3(3))) engine = innodb;
|
|
insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd');
|
|
alter table t1 drop primary key, add primary key(o1(3),o2,o3(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 varchar(10), o2 int, o3 varchar(10), primary key(o1,o2,o3(3))) engine = innodb;
|
|
insert into t1 values('abd', 1, 'acd'), ('acd', 2, 'abd');
|
|
alter table t1 drop primary key, add primary key(o1,o2,o3(2)), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1),(2,2);
|
|
alter table t1 drop primary key, add primary key(o1,o2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1),(2,2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1),(2,2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(n1,o1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1),(2,2);
|
|
alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(n1,o1,n2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1),(2,2);
|
|
alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(n1,n2,o1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1),(2,2);
|
|
alter table t1 add n1 int not null, add n2 int not null, drop primary key, add primary key(o1,n1,n2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1),(2,2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,n1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1),(2,2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1,o2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1),(2,2);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(n1,o1,o2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, o3 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1,2),(2,2,1);
|
|
alter table t1 drop primary key, add primary key(o1,o2,o3), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int not null, o3 int not null, primary key(o1)) engine = innodb;
|
|
insert into t1 values(1,1,2),(2,2,1);
|
|
alter table t1 drop primary key, add primary key(o1,o3,o2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb;
|
|
insert into t1 values(1,1,2),(2,2,1);
|
|
alter table t1 drop primary key, add primary key(o1,o2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int, o3 int, o4 int not null, primary key(o1,o2,o3)) engine = innodb;
|
|
insert into t1 values(1,1,2,2),(2,2,1,1);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,o3,o4), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb;
|
|
insert into t1 values(1,1,2),(2,2,1);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1,o2,n1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb;
|
|
insert into t1 values(1,1,2),(2,2,1);
|
|
alter table t1 add n1 int not null, drop primary key, add primary key(o1,n1,o2), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb;
|
|
insert into t1 values(1,1,2),(2,2,1);
|
|
alter table t1 drop primary key, add primary key(o1), lock=none;
|
|
drop table t1;
|
|
create table t1(o1 int, o2 int, primary key(o1,o2)) engine = innodb;
|
|
insert into t1 values(1,1),(2,1);
|
|
alter table t1 drop primary key, add column a int unique auto_increment,
|
|
add primary key(o1,o2,a), algorithm=inplace;
|
|
drop table t1;
|
|
SET DEBUG_DBUG = @saved_debug_dbug;
|