34 lượt xem
Ẩn danh
Ngày 23 Tháng 05
Em đang phải xử lý 1 lượng dữ liệu lớn. Nên em đang tính sử dụng câu lệnh vòng lặp for để sắp xếp lại và xếp vào table. Nhưng hiện tại có vấn đề là, column trong table lại là primary key nên nếu đưa vào giá trị lặp thì bị error ạ. Vì vậy để xử lý giá trị lặp thì em định ghép 2 column lại rồi chỉ định thành 1 primary key, ko biết có ổn không. Hay là mình phải dùng code để check giá trị lặp thì ok hơn? Thực tế thì có thể dùng fetchall để nhận data sau đó dùng continue xử lý các giá trị lặp nếu có cũng được, nhưng e muốn đi theo hướng xử lý bằng continue trong vòng lặp for í ạ
Đánh giá câu hỏi ngay!
Hãy ấn ↑Up Vote với những câu hỏi cụ thể và chi tiết
Hãy ấn ↓Down Vote với những câu hỏi chưa rõ ràng Careerly sẽ nhắc người hỏi chỉnh sửa lại.
2 câu trả lời
BEST
Chào bạn, vậy là mình hiểu bạn đang chấp nhận việc ghi đè giá trị trùng lặp cho các bản ghi phía sau. Ở trường hợp này bạn có thể sử dụng câu lệnh upsert để tránh việc conflict lúc insert. 🦈 Upsert trong SQL? Upsert tức là Insert nếu không tồn tại, còn nếu đã tồn tại, thì update. Khái niệm này mình bịa ra 👿, đùa đấy, thực tế trong SQL không có từ khóa Upsert như Mongodb, tuy nhiên ta có thể mô phỏng hành vi này qua việc sửa đổi một chút câu lệnh với từ khóa ON CONFLICT với Postgres, ON DUPLICATE của Mysql hoặc dùng Rowcount trong Sqlserver. 🐫 Batching dữ liệu Ngoài ra với lượng dữ liệu thật sự lớn, bạn cũng có thể áp dụng lập trình bất đồng bộ (hoặc song song), chia nhỏ file ra thành nhiều chunk để xử lý cùng lúc.
1## Postgresql:
2
3INSERT INTO table_name(column_list)
4VALUES(value_list)
5ON CONFLICT primarykey UPDATE SET ....;
6
7
8## Mysql:
9
10INSERT INTO table_name (column_list) VALUES (value_list)
11 ON DUPLICATE primarykey UPDATE ...;
12
13
14## SQL Server:
15
16UPDATE table_name
17SET .....
18WHERE id = 1
19
20IF @@ROWCOUNT = 0
21 INSERT INTO table_name
22 (column_list)
23 VALUES (value_list)
Không rõ câu hỏi là bạn đang dùng loại DB nào, SQL hay NoSQL, tuy nhiên thì việc ghép 2 column làm primary key cũng có thể là một cách chấp nhận được với lượng dữ liệu không quá lớn, tuy nhiên đối với lượng dữ liệu lớn thì cần phải lưu ý khi đánh index cũng như tốc độ các câu query. Thực ra việc trick qua các giá trị lặp này khá đơn giản, mình thấy bạn có sẵn 2 column làm primary key vậy thì có thể thay giá trị cột ID bằng 1 mã hash của tổng hợp data của 2 cột nói trên, vừa đảm bảo được tính duy nhất của Primary Key mà cũng không phải lo lắng tối ưu quá nhiều hay làm phức tạp các câu query lên. Ý tưởng này thì nó cũng kha khá giống cách mà MongoDB nó đánh giá trị _id, tuy nhiên thì để giải quyết vấn đề triệt để hơn thì bạn nên cung cấp thêm thông tin :D
Đăng ký ngay bây giờ để đọc toàn bộ câu trả lời!
Cộng đồng lập trình viên sẽ giải đáp tường tận cho bạn.
Bạn đã có tài khoản rồi?
Đăng ký ngay bây giờ để đọc toàn bộ câu trả lời!
Cộng đồng lập trình viên sẽ giải đáp tường tận cho bạn.