Mục trùng lặp mysqli

Thông thường, khi bị lỗi, các bạn sẽ thấy lỗi này khi gửi bài mới, đăng ký thành viên, gửi tin nhắn

Nguyên nhân thì có nhiều và cũng làm nhiều phía, mình không đề cập đến mà chỉ hướng dẫn cách giải quyết thôi

Dưới đây là 1 ví dụ về lỗi này

Mã số

Invalid SQL:
INSERT INTO [B][COLOR=Red][SIZE=5]user[/SIZE][/COLOR][/B]
    (options, adminoptions, usertitle, customtitle, username, email, languageid, homepage, birthday_search, birthday, showbirthday, icq, aim, yahoo, msn, skype, parentemail, referrerid, ipaddress, posts, usergroupid, reputationlevelid, reputation, warnings, infractions, ipoints, pmpopup, autosubscribe, threadedmode, showvbcode, styleid, timezoneoffset, daysprune, joindate, lastactivity, lastpost, salt, passworddate, password, membergroupids, displaygroupid, lastvisit, maxposts, startofweek)
VALUES
    (45107287, 0, 'Junior Member', 0, 'test1', '', 0, '', '', '', 0, '', '', '', '', '', '', 0, '', 0, 2, 5, 10, 0, 0, 0, 1, -1, 0, 1, 0, '7', -1, 1326088080, 1326088080, 0, '6bteLjHSJL$R1~}p|m3~ne8qJCpKbQ', FROM_UNIXTIME(1326088157), 'c210438fa5b77d089de0cd05b4e157f6', '', '', 1326088157, -1, -1);

MySQL Error   : Duplicate entry '4294967295' for key 1

Các bạn lưu tên bảng ở trên nhé


First
- Bạn tải bản vBulletin cùng phiên bản với bản bạn đang dùng
- Upload thư mục cài đặt lên hàng ngang file index. php current
- Xóa file cài đặt/cài đặt. php go rồi làm tiếp các bước sau

- Login vào AdminCP đc các bạn làm như sau

Mục trùng lặp mysqli



- Sau đó kéo xuống tùy chọn chức năng Fix Unique Index

Mục trùng lặp mysqli



Làm xong thì xóa thư mục cài đặt đi

Cách này áp dụng cho mọi phiên bản vBulletin

 

If you insert a data row by using the ON DUPLICATE KEY UPDATE clause in an INSERT-statement, the mysql_insert_id() function will return not the same results as if you directly use LAST_INSERT_ID() in MySQL.

See the following example:

   // insert a datarow, primary key is auto_increment
   // value is a unique key
   $query = "INSERT INTO test (value) VALUES ('test')";
   mysql_query( $query );

   echo 'LAST_INSERT_ID: ',
          mysql_query( "SELECT LAST_INSERT_ID()" ),
          '
mysql_insert_id: ',
          mysql_insert_id();

?>

This will print:

LAST_INSERT_ID: 1
mysql_insert_id: 1

In this case the function returns the same as the MySQL-Statement.
But see the insert on an existing key:

   $query = "INSERT INTO test (value)
                  VALUES ('test')
                  ON DUPLICATE KEY UPDATE value = 'test2'";
   mysql_query( $query );

   echo 'LAST_INSERT_ID: ',
          mysql_query( "SELECT LAST_INSERT_ID()" ),
          '
mysql_insert_id: ',
          mysql_insert_id();

?>

This will print:

See the following example:2

See the following example:3

See the following example:4

See the following example:5

See the following example:6

Khi bạn thiết kế cơ sở dữ liệu, hãy thưởng cho chúng tôi hoặc để từ khóa id chính có định dạng là auto_increament

Ví dụ


CREATE TABLE `table_product` (
`product_id` INT(12) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`product_id`)
)
ENGINE=InnoDB
ROW_FORMAT=DEFAULT

Một hôm đột nhiên truy vấn thêm dữ liệu báo lỗi


"Failed toread auto-increment value from storage engine"
Hoặc
Duplicate entry '123'forkey'PRIMARY'

Kiểm tra dữ liệu bảng table_product chưa có từ khóa 123, giải quyết lỗi trên as after
(nguyên nhân gây ra lỗi nhantam sẽ cập nhật ở bài khác)

Cách 1 Truy vấn


SHOW table STATUS;

Trạng thái các bảng dữ liệu sẽ hiển thị, bạn để ý trạng thái của bảng table_product, cột Auto_increment, chúng ta sẽ thấy giá trị là một con số rất lớn. Chúng ta phải sửa lại giá trị này bằng cách

Bạn có 1 bảng B muốn chèn vào 1 bảng A và bảng B có khá nhiều dữ liệu trùng lặp với bảng A. Khi bạn thực hiện lệnh chèn sẽ xảy ra lỗi Error Code. 1062. Mục nhập trùng lặp do bảng A có cột là từ khóa chính (PRIMARY KEY) hoặc cột đó có thuộc tính là UNIQUE

Để thực hiện việc chèn bảng A vào bảng B và bỏ qua các dữ liệu lặp lại này bằng cách sử dụng lệnh INSERT IGNORE

Ta cùng tham khảo ví dụ bằng 2 bảng sau. Đầu tiên ta tạo 2 bảng sinhvien1 và sinhvien2 và thêm dữ liệu vào 2 bảng này

DROP TABLE IF EXISTS sinhvien1;
CREATE TABLE sinhvien1(
MaSV int,
Ten varchar(50) DEFAULT NULL,
CONSTRAINT `primary_masv`PRIMARY KEY ( MaSV )
);

DROP TABLE IF EXISTS sinhvien2;
CREATE TABLE sinhvien2(
MaSV int,
Ten varchar(50) DEFAULT NULL,
CONSTRAINT `primary_masv`PRIMARY KEY ( MaSV )
);

INSERT INTO sinhvien1 (MaSV, Ten) VALUES (111, 'Nguyễn Thị Duyên');
INSERT INTO sinhvien1 (MaSV, Ten) VALUES (123, 'Trần Anh Khoa');
INSERT INTO sinhvien1 (MaSV, Ten) VALUES (124, 'Vũ Tuấn Anh');
 
INSERT INTO sinhvien2 (MaSV, Ten) VALUES (111, 'Nguyễn Thị Mỹ Duyên');
INSERT INTO sinhvien2 (MaSV, Ten) VALUES (246, 'Nguyễn Mỹ Linh');
INSERT INTO sinhvien2 (MaSV, Ten) VALUES (124, 'Trần Công Đức');

Như các bạn có thể thấy, có 1 sinh viên có mã 111 và 124 trùng lặp. Bây giờ ta sẽ chèn bảng dữ liệu sinhvien2 vào bảng dữ liệu sinhvien1 bằng lệnh INSERT. Ở ví dụ bên dưới mình sẽ tạo 1 giao dịch bằng lệnh BẮT ĐẦU GIAO DỊCH để phòng trường hợp kết quả bị sai thì mình còn ROLLBACK lại được

START TRANSACTION;
INSERT INTO sinhvien1
SELECT * FROM sinhvien2;  -- khi chạy báo lỗi

MySQL báo lỗi Error Code. 1062. Nhân bản mục nhập '111' cho khóa 'sinhvien1. PRIMARY’ và hủy luôn lệnh INSERT. Bây giờ ta sẽ thực hiện lệnh INSERT IGNORE

Quảng cáo

Mục trùng lặp mysqli

START TRANSACTION; 
INSERT IGNORE INTO sinhvien1
SELECT * FROM sinhvien2;

Sau khi thực hiện các truy vấn trên, MySQL cho phép chèn tất cả các bảng, bỏ qua các hàng trùng lặp và chỉ trả về cảnh báo 1 hàng bị ảnh hưởng, 2 cảnh báo. 1062 Duplicate entry ‘111’ cho key ‘sinhvien1. Hồ Sơ CHÍNH’. 3  Bản sao. 2  Cảnh báo. 2

Resistent return table sinhvien1 is

SELECT * FROM sinhvien1;
+-----+-------------------+
|MaSV |	Ten               |
+-----+-------------------+
|111  |	Nguyễn Thị Duyên  |
|123  |	Trần Anh Khoa     |
|124  |	Vũ Tuấn Anh       |
|246  |	Nguyễn Mỹ Linh    |
+-----+-------------------+
COMMIT;   --  sau khi kiểm tra dữ liệu thấy đúng chạy lệnh này
-- ROLLBACK;  nếu không đúng chạy lệnh này

Các bạn có thể xem kết quả sinh viên có mã 111 và 124 tại bảng sinhvien2 bị bỏ qua, không chèn vào bảng sinhvien1. Sau khi kiểm tra dữ liệu không xảy ra lỗi ta chạy lệnh COMMIT để ghi dữ liệu vào cơ sở dữ liệu

Replace the data repeat used REPLACE

________số 8_______

MySQL trả về cảnh báo 5 bản ghi bị ảnh hưởng. 3 bản sao. 2 cảnh báo. 0 and results of table sinhvien1 các sinh viên có mã 111 và 124 đã được thay thế

SELECT * FROM sinhvien1;
+-----+----------------------+
|MaSV |	Ten                  |
+-----+----------------------+
|111  |	Nguyễn Thị Mỹ Duyên  |
|123  |	Trần Anh Khoa        |
|124  |	Trần Công Đức        |
|246  |	Nguyễn Mỹ Linh       |
+-----+----------------------+

Bài viết dựa trên MySQL Document và chạy trên MySQL 8. 0. 26 và MariaDB 10. 2. Mong được các bạn đóng góp ý kiến ​​để website ngày càng phát triển