Heim  >  Artikel  >  Datenbank  >  pt-online-schema-change ändert den Primärschlüssel der MySQL-Tabelle

pt-online-schema-change ändert den Primärschlüssel der MySQL-Tabelle

高洛峰
高洛峰Original
2016-10-29 10:53:231892Durchsuche

Nachdem ich das Unternehmen eine Zeit lang geführt hatte, stellte ich fest, dass die ursprüngliche Primärschlüsseleinstellung unangemessen war. Zu diesem Zeitpunkt wollte ich den Primärschlüssel ändern. Dieser Bedarf ist in der tatsächlichen Produktion immer noch recht groß.

Nachfolgend werfen wir einen Blick darauf, wie pt-online-schema-change diese Art von Problem löst.

Erstellen Sie zunächst eine Testtabelle

Erstellen Sie Tabelle t2(c1 int Primary Key, c2 int);

Konstrukt Testdaten

delimiter //
create procedure p1()
begin
  declare v1 int default 1;
  set autocommit=0;
  while v1 <=100000 do
    insert into test.t2(c1,c2) values(v1,v1+100);
    set v1=v1+1;
    if v1%1000 =0 then
      commit;
    end if;
  end while;
end //
delimiter ;
call p1;

Als nächstes beginnen Sie mit pt-online-schema-change, um den Primärschlüssel der t2-Tabelle zu ändern

1. Fügen Sie der Spalte c1 einen eindeutigen Schlüssel hinzu

# pt-online-schema-change --execute --alter "modify c1 int unique key" --print D=test,t=t2

Zu diesem Zeitpunkt ist die Tabellenstruktur des Die T2-Tabelle lautet wie folgt:

mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `c1` int(11) NOT NULL DEFAULT &#39;0&#39;,
  `c2` int(11) DEFAULT NULL,
  PRIMARY KEY (`c1`),
  UNIQUE KEY `c1` (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
row in set (0.03 sec)

2. Löschen Sie den Primärschlüssel in Spalte c1

# pt-online-schema-change --execute --alter "drop Primary Key" - -no-check-alter - -print D=test,t=t2

Hinweis: Um den Primärschlüssel zu löschen, müssen Sie die Option --no-check-alter hinzufügen

At Diesmal ist die Tabellenstruktur von t2 wie folgt:

mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `c1` int(11) NOT NULL DEFAULT &#39;0&#39;,
  `c2` int(11) DEFAULT NULL,
  UNIQUE KEY `c1` (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
row in set (0.05 sec)

3. Fügen Sie den Primärschlüssel in Spalte c2 hinzu

# pt-online-schema-change --execute --alter „modify c2 int Primary Key“ --print D=test,t=t2

Zu diesem Zeitpunkt ist die Tabellenstruktur von t2 wie folgt:

mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `c1` int(11) NOT NULL DEFAULT &#39;0&#39;,
  `c2` int(11) NOT NULL,
  PRIMARY KEY (`c2`),
  UNIQUE KEY `c1` (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
row in set (0.02 sec)

4 Schlüssel in Spalte c1

# pt-online-schema-change --execute - -alter "drop key c1" --print D=test,t=t2

Zu diesem Zeitpunkt ist der Primärschlüsseländerung von t2 ist abgeschlossen

mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `c1` int(11) NOT NULL DEFAULT &#39;0&#39;,
  `c2` int(11) NOT NULL,
  PRIMARY KEY (`c2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
row in set (0.02 sec)


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn