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ả REPLACE và INSERT...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=latin1Phầ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