Mysqldump CHÈN bỏ qua

Trên dòng lệnh, nếu bạn đang ở trong cùng thư mục chứa tệp kết xuất, hãy sử dụng các lệnh này (với các thay thế thích hợp)

C:\> mysql -u root -p

mysql> create database mydb;
mysql> use mydb;
mysql> source db_backup.dump;

Mysql – “CHÈN BỎ QUA” so với “CHÈN… TRÊN CẬP NHẬT KHÓA DUPLICATE”

Tôi khuyên bạn nên sử dụng INSERT...ON DUPLICATE KEY UPDATE

Nếu bạn sử dụng INSERT IGNORE, thì hàng đó sẽ không thực sự được chèn nếu nó dẫn đến một khóa trùng lặp. Nhưng câu lệnh sẽ không tạo ra lỗi. Nó tạo ra một cảnh báo thay vì. Những trường hợp này bao gồm

  • Chèn khóa trùng lặp vào các cột có ràng buộc PRIMARY KEY hoặc UNIQUE
  • Chèn NULL vào cột có ràng buộc NOT NULL
  • Chèn một hàng vào một bảng được phân vùng, nhưng các giá trị bạn chèn không ánh xạ tới một phân vùng

Nếu bạn sử dụng REPLACE, MySQL thực sự thực hiện một DELETE theo sau là một

mysql> create table foo (id serial primary key, u int, unique key (u));
mysql> insert into foo (u) values (10);
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   10 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

mysql> insert into foo (u) values (10) on duplicate key update u = 20;
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   20 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
0 bên trong, điều này có một số tác dụng phụ không mong muốn

  • ID tăng tự động mới được phân bổ
  • Các hàng phụ thuộc có khóa ngoại có thể bị xóa (nếu bạn sử dụng khóa ngoại xếp tầng) hoặc nếu không thì sẽ ngăn REPLACE
  • Trình kích hoạt kích hoạt trên DELETE được thực thi không cần thiết
  • Tác dụng phụ cũng được lan truyền đến các bản sao

điều chỉnh. cả REPLACEINSERT...ON DUPLICATE KEY UPDATE đều là những phát minh độc quyền, phi tiêu chuẩn dành riêng cho MySQL. ANSI SQL 2003 định nghĩa câu lệnh

mysql> create table foo (id serial primary key, u int, unique key (u));
mysql> insert into foo (u) values (10);
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   10 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

mysql> insert into foo (u) values (10) on duplicate key update u = 20;
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   20 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
5 có thể giải quyết nhu cầu tương tự (và hơn thế nữa), nhưng MySQL không hỗ trợ câu lệnh
mysql> create table foo (id serial primary key, u int, unique key (u));
mysql> insert into foo (u) values (10);
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   10 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

mysql> insert into foo (u) values (10) on duplicate key update u = 20;
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   20 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
5


Một người dùng đã cố gắng chỉnh sửa bài đăng này (việc chỉnh sửa đã bị người kiểm duyệt từ chối). Bản chỉnh sửa đã cố gắng thêm một xác nhận quyền sở hữu rằng INSERT...ON DUPLICATE KEY UPDATE khiến id tăng tự động mới được phân bổ. Đúng là id mới được tạo, nhưng nó không được sử dụng trong hàng đã thay đổi

Xem trình diễn bên dưới, đã thử nghiệm với Percona Server 5. 5. 28. Biến cấu hình

mysql> create table foo (id serial primary key, u int, unique key (u));
mysql> insert into foo (u) values (10);
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   10 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

mysql> insert into foo (u) values (10) on duplicate key update u = 20;
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   20 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
8 (mặc định)

mysql> create table foo (id serial primary key, u int, unique key (u));
mysql> insert into foo (u) values (10);
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   10 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

mysql> insert into foo (u) values (10) on duplicate key update u = 20;
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   20 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

Phần trên chứng tỏ rằng câu lệnh IODKU phát hiện bản sao và gọi bản cập nhật để thay đổi giá trị của

mysql> create table foo (id serial primary key, u int, unique key (u));
mysql> insert into foo (u) values (10);
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   10 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

mysql> insert into foo (u) values (10) on duplicate key update u = 20;
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   20 |
+----+------+

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
9. Lưu ý rằng
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  1 |   20 |
+----+------+
mysql> replace into foo (u) values (20);
mysql> select * from foo;
+----+------+
| id | u    |
+----+------+
|  3 |   20 |
+----+------+
0 cho biết id đã được tạo nhưng không được sử dụng trong hàng

Trong khi đó, REPLACE xóa hàng gốc và chèn một hàng mới, tạo và lưu trữ id tăng tự động mới

Chèn hoặc bỏ qua là gì?

Thông thường INSERT dừng và khôi phục khi gặp lỗi. Bằng cách sử dụng từ khóa BỎ QUA, tất cả các lỗi được chuyển thành cảnh báo, điều này sẽ không dừng việc chèn các hàng bổ sung . Các tùy chọn BỎ QUA và TRÌ HOÃN bị bỏ qua khi bạn sử dụng CẬP NHẬT KHÓA TRÊN DUPLICATE.

Làm cách nào để tránh chèn dữ liệu trùng lặp trong MySQL?

Lưu ý − Sử dụng lệnh INSERT IGNORE thay vì lệnh INSERT . Nếu một bản ghi không trùng lặp với một bản ghi hiện có, thì MySQL sẽ chèn nó như bình thường. Nếu bản ghi trùng lặp, thì từ khóa IGNORE yêu cầu MySQL loại bỏ nó một cách âm thầm mà không tạo ra lỗi.

Bỏ qua chèn có nhanh hơn không?

TL;DR. Chèn một số lượng lớn hàng mà không có xung đột nhanh hơn RẤT NHIỀU so với việc (không) chèn lại cùng một hàng , CẢ HAI bằng cách sử dụng cú pháp INSERT IGNORE.

Làm cách nào để chèn dữ liệu từ một bảng cơ sở dữ liệu máy chủ sang bảng cơ sở dữ liệu máy chủ khác trong MySQL?

Nếu chúng ta muốn sao chép bảng hoặc cơ sở dữ liệu từ máy chủ MySQL này sang máy chủ MySQL khác, thì hãy sử dụng mysqldump với tên cơ sở dữ liệu và tên bảng . Chạy lệnh sau tại máy chủ nguồn. Điều này sẽ kết xuất cơ sở dữ liệu hoàn chỉnh vào kết xuất.