Xử lý error trên mysql khi để unique nhưng dữ liệu bị lặp lại?

Mình đang lấy các bài viết (Feed) từ facebook dùng FB API sau đó lưu vào cơ sở dữ liệu. Trường id_feed của các bài viết mình để unique để cho nó không lưu lặp lại các dữ liệu đã có rồi.
Vấn đề là khi mình chạy file để lấy thêm các dữ liệu mới thì vẫn lấy các bài viết mới ok nhưng mà nó sẽ báo error sql rằng các dữ liệu kia không được phép trùng lặp do nó lấy cả các dữ liệu cũ nữa.

1, Hoặc xóa các bài đã lưu rồi lưu mới,
2, Hoặc không lấy các bài viết (Feed) đã lấy trước đó nữa.

1 Like

Ban đầu findByIdFeed, nếu thấy thì cho vào update, không thì insert.
Hoặc tìm hàm kiểu insertOrUpdate trên Cake xem.

1 Like
insert ignore into test_warnings (id_, num_) values (?,?)

https://dev.mysql.com/doc/refman/5.5/en/insert.html
php chắc dùng mysql nhỉ

1 Like

PDO nó có driver cho nhiều thứ lắm anh.

1 Like

Nếu số lượng query mỗi lần không lên đến hàng triệu bài thì có thể thử làm cách này để tránh việc báo lỗi trùng lắp: query hết các id_feed từ CSDL vào một mảng. Khi lấy bài trên FB về thì tìm trong mảng đó xem có tồn tại giá trị id không, nếu không tồn tại thì mới INSERT vào MySQL, còn tồn tại thì bỏ qua. Cách mỗi lần mỗi query kiểm tra cũng được nhưng dễ khiến việc chậm, nặng tải nếu có hàng ngàn biểu ghi mỗi lần.

đúng như bác nói đó. làm thế thì cồng kềnh quá :D. Dữ liệu mới thì vẫn lấy được, mỗi tội nó vẫn báo cái error đó thôi @@. …

nếu làm như vậy thì sẽ bị chậm nếu dữ liệu lớn. nó phải so sánh rất nhiều @@ Mình để unique thì dữ liệu mới thì vẫn lấy được và không bị trùng, mỗi tội nó vẫn báo cái error đó thôi @@. …

chắc chỉ còn cách xoá này thôi, chứ duyệt kiểm tra xem các (Feed) đã lấy chưa còn mất thời gian hơn ấy nhỉ.

Cái này còn tùy vào cách check và số lượng record mà bác thao tác nữa :smiley:

1 Like

cứ coi như dữ liệu rất lớn đi. Cách check thì mình nghĩ cứ mỗi cái feed mình lấy được trên facebook phải so sánh vs bao nhiêu là dữ liệu đã có trên sql. Mà số lượng feed cũng nhiều nữa.
Mà thương thì file get dữ liệu này cũng chỉ chạy 1 lần vào cuối tháng để lấy dữ liệu của cả tháng đó chẳng hạn, mình đang tính đến trường hợp nếu chẳng may chạy file đó nhiều lần thì sẽ bị lặp dữ liệu thì lại mất công xoá đi get lại.

À, save() và saveAll() của Cake tự động Update nếu trùng id mà nhỉ, bác đang insert bằng SQL script à ?

@hieudien: nếu để tên cột lưu id của feed là id thì nó sẽ tự check trùng nhau. Nhưng ở đây id của feed mình lưu vào cột id_feed, còn cột id mình để là primary và tăng tự động, như thế nó sẽ vẫn bị lặp dữ liệu. Mặc định thì primaryKey của cake nó là id hay sao ý, mình thử khai báo var $primaryKey = 'id_feed' trong model thì lại được. Nhưng không hiểu rõ cơ chế lắm, vì mình để primary là cột id rồi mà. Nếu thế thì nó thay khoá chính của mình sang cột id_feed à hay thế nào nhỉ: https://book.cakephp.org/2.0/en/models/model-attributes.html#primarykey

Bước đường cùng thì phải đổi lại primary key thôi bác :v:
Khi nào save xong thì lại đổi lại key cũ vậy =))

Mà có cần thiết phải có cả cột id và cột id_feed ko bác nhẩy ? Nếu không cần thì cứ dùng id theo mặc định thôi bác

1 Like

Insert ignore
Nên chọn dbms rồi học hết tính năng nha. :grin:

Không biết mýql có không (lâu lắm rồi không theo dõi) nhưng mà bên pótgresql có upsert để dành cho trường hợp này

Drop cột id ngay và luôn :smiley: khóa chính là feed_id rồi.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?