Langkau ke kandungan utama

Tambah medan id yang auto_increment dan primary key kepada table yang takde tapi perlu sama dengan table replicate.. aduhh

Kes dia macam ni

aku ada 2 DB yang mana satunya adalah DB master yang replicated daripada DB utama.

satu DB lagi adalah DB untuk development tetapi user exited untuk guna dan sekarang ni dah macam production. Secara positifnya, sistem flow dan structure kira dah ok la tu bila user tak komplen.


Masalahnya, dalam DB dev, aku masukkan auto_increment value dengan nama 'id' pada satu table yang agak anchor jugak. Tapi sebenarnya, kalau ikut table yang asal, field tu takde pun (legacy system).


Jadi, oleh kerana DB dev ini tidak update dan DB master tu adalah slave replication dengan server DB utama, maka bilangan row untuk table dah jadi lain.. Dan kalau aku tambah je auto_increment field dalam DB master tu, pasti sistem aku akan crush/bugged sebab sistem tu akan jadikan foreign key dalam table lain.


Objektif aku ialah:

1. Tambah kolum ID dalam table pada DB master
2. Selaraskan nilai ID dalam table dev dan table MASTER
3. bagi row yang takde dalam table di dev, nilai 0 akan digantikan dengan nilai yang unik (auto_increment)
4. setkan kolum ID dalam table DB master sebagai auto_increment, primary key.


Tapi ada satu step lagi kena tambah sebab dalam table master tu ada duplicate rows. Jadi aku kena delete dulu salah satu rows yang duplicate tadi sebelum aku setkan id sebagai primary_key.


OK,, ini yang aku buat...

katakan nama table : visits

1. tambah row ID pada table visits di master DB

SQL : 

     ALTER TABLE  `InPatient` ADD  `id` INT NOT NULL FIRST

2. selaraskan nilai 'id' pada table dev dengan table master berdasarkan params yang sama.

SQL :

         UPDATE master.visits mv
    LEFT JOIN dev.visits dv 
    ON dv.params1 = mv.params1 AND dv.params2 = mv.params2
    AND dv.params3=mv.params3
    SET mv.id = dv.id;

Dengan ini, nilai id dalam table dev akan ditiru kepada table master.

Oleh kerana table di master mengandungi lebih banyak row, maka nilai id = 0 akan wujud bagi row yang tak ada dalam table di dev.


Kita perlu update nilai id ini dengan nilai auto_increment berdasarkan nilai tertinggi id.

2.5 ini adalah khusus kepada table aku sendiri memandangkan ada duplicate row pada table di master.

paparkan semua row yang duplicate..

SQL :

                       SELECT * 
         FROM visits 
         WHERE id<>0 
         GROUP BY id 
         HAVING COUNT(id)>1;

aku ada total 48 row yang duplicate id ni. Dengan kata lain, ada 49 row yang sama. Jadi aku kena delete la satu row. Untuk ini, aku cuma gunakan phpmyadmin je, select semua row dan tekan drop.

tapi aku pastikan dulu bilangan row adalah betul sebelum dan selepas delete duplicate row tu.

total row aku ada - bil row yang duplicate = 555850-48 = 555802

jadi selepas aku delete row duplicate menggunakan phpmyadmin, bilangan total row sepatunya akan jadi seperti yang aku kira tu.

Secara selamatnya, bilangan row akan betul la. InsyaAllah.


3. Update nilai id mengikut nilai max(id) secara auto increment.

Sebelum aku update nilai id mengikut nilai max(id) yang sedia ada secara auto_increment, aku check dulu  berapa row yang aku kena update. Caranya ialah mengira berapa row dengan id = 0

SQL :

       SELECT *
       FROM visits

       WHERE id=0

Jadi aku ada 125312 row untuk diupdate.


SQL :

UPDATE master.visits mv, 
  (SELECT @n := (Select MAX(id) FROM master.visits)) n
   SET mv.id = @n := @n+1
   WHERE mv.id = 0

       *125312 rows affected

Nilai row yang dikemaskini sama dengan jumlah row dengan nilai idnya adalah 0.

Akhir sekali, pastikan tak de id yang duplicate..

SQL :

SELECT * FROM `visits`
GROUP BY id
HAVING COUNT(id)>1

* MySQL returned an empty result set

yeay!


4. Setkan id sebagai primary_key dan auto_increment.

Guna je phpmyadmin..

Setakat yang aku buat ni takde masalah. Harap dapat selesaikan masalah ni jugak..

Terima kasih..




     

       


Ulasan

Catatan popular daripada blog ini

Apa Maksud RON dalam pengkelasan Petrol?

RON dan Petrol Oleh yusdirman, Oktober 2014 RON adalah singkatan daripada Research Octane Number Ianya kaedah penarafan bahan api. Lebih tinggi nilai RON, lebih mahal harga PETROL. Adakah minyak RON 97 lebih berkuasa berbanding RON 95? RON merujuk kepada tahap bahan api menahan rintangan "ketukan" semasa proses pembakaran oleh palam pencucuh dalam enjin. Ianya merujuk kepada tahap ketahanan bahan api untuk tidak terbakar sebelum dinyalakan oleh palam pencucuh dalam enjin. "ketukan" dalam konteks RON ini adalah apabila campuran bahan api dan udara dalam enjin terbakar lebih awal sebelum api dari palam pencucuh menbakarnya. Pembakaran awal ini mungkin disebabkan enjin terlalu panas. Haba dari silinder enjin itu sendiri mungkin telah menyalakan bahan api sebelum palam pencucuh menyala. Ini boleh menurunkan prestasi dan mungkin boleh memudaratkan enjin! Jadi, RON bukannya bermaksud LEBIH KUASA! Ianya bermaksud bahan api itu dapat menahan tekanan dari

Load Balancing dengan Nginx dan Puma

Load Balancing dengan Nginx dan Puma Tutorial ini adalah sangat ringkas hanya untuk menunjukkan kebolehan nginx sebagai load balancer yang dapat menjadi 'orang tengah' antara banyak server di belakangnya Keperluan 1. Paling kurang 2 server aplikasi 2. Satu server diinstall nginx Contoh Persekitaran yang sekarang 1. server1: os: debian application: ruby on rails web server : puma dns : myaplication1.yusdirman.com 2. server2: myaplication2.yusdirman.com os:debian application: ruby on rails web server : puma dns : myaplication1.yusdirman.com 3. nginx diinstall di server1 /ets/nginx/nginx.conf setup (default): worker_processes  2; worker_processes  auto; worker_rlimit_nofile 65536; error_log  logs/error.log  notice; error_log  logs/error.log  info; events {   worker_connections  65536; } http {   include       mime.types;   default_type  application/octet-stream;   sendfile        on;   tcp_nopush on;   tcp_nodelay on;   keepalive_tim

Server Redundancy - Pertindanan Komputer Pelayan

alkisahnya tercari-cari untuk buat server redundancy ( pertindihan komputer pelayan ) atas sebab perlunya server yang sentiasa on-line tanpa ada downtime yang lama. Dan, cabarannya adalah memang kami tak pernah jalani apa-apa latihan, pengalaman dan apa jua pengetahuan berkenaan teknologi ini. Yang pastinya, perlu banyak mengoogle. Setakat ini, ada banyak kaedah untuk memastikan aplikasi masih terus boleh berfungsi walaupun server mati/rosak. 1. guna 2 server yang sama. Bila satu mati, satu lagi yang masih hidup dapat terus melayan pengguna. 2. guna 2 talian rangkaian yang berbeza. Bila satu talian rosak/putus, masih ada satu lagi talian rangkaian yang berfungsi. 3. storan di server guna raid ( redundant array of independent disk ) atau dalam bahasa melayu : barisan disk berlainan yang bertindan. Raid dapat menjadikan sebilangan hd menjadi 1 dengan semua data pada 1 hd adalah sama dengan data pada hd 2. (mirroring) 4. satu IP maya untuk sebilangan server. 2 server yang mena