MySQL hiện là máy chủ cơ sở dữ liệu phổ biến nhất được sử dụng với ngôn ngữ lập trình PHP
để xây dựng các ứng dụng web động. Tuy nhiên, DB2 là một cơ sở dữ liệu phổ biến khác được
PHP hỗ trợ đầy đủ và cung cấp các lợi thế hấp dẫn hơn so với MySQL, làm cho nó trở thành một
sự lựa chọn lý tưởng cho nhiều ứng dụng.
Loạt bài này mô tả tại sao việc di chuyển một ứng dụng PHP sang DB2 lại có ý nghĩa, cách
chuẩn bị cho việc di trú, cách thực hiện nó, cách hỗ trợ nó, và cách xử lý các rủi ro tiềm năng
dựa trên kinh nghiệm của các tác giả cho một cuộc di trú mới nhất. Nhiều mẫu mã và mẫu cấu
hình được cung cấp, cũng như các chỉ dẫn tài nguyên để giúp cho dự án chạy trơn tru.
22 trang |
Chia sẻ: lylyngoc | Lượt xem: 1792 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Di chuyển một ứng dụng PHP từ MySQL sang DB2, Phần 3: Chuyển đổi mã PHP của bạn, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Di chuyển một ứng dụng PHP từ MySQL sang DB2,
Phần 3: Chuyển đổi mã PHP của bạn
Giới thiệu về loạt bài này
MySQL hiện là máy chủ cơ sở dữ liệu phổ biến nhất được sử dụng với ngôn ngữ lập trình PHP
để xây dựng các ứng dụng web động. Tuy nhiên, DB2 là một cơ sở dữ liệu phổ biến khác được
PHP hỗ trợ đầy đủ và cung cấp các lợi thế hấp dẫn hơn so với MySQL, làm cho nó trở thành một
sự lựa chọn lý tưởng cho nhiều ứng dụng.
Loạt bài này mô tả tại sao việc di chuyển một ứng dụng PHP sang DB2 lại có ý nghĩa, cách
chuẩn bị cho việc di trú, cách thực hiện nó, cách hỗ trợ nó, và cách xử lý các rủi ro tiềm năng
dựa trên kinh nghiệm của các tác giả cho một cuộc di trú mới nhất. Nhiều mẫu mã và mẫu cấu
hình được cung cấp, cũng như các chỉ dẫn tài nguyên để giúp cho dự án chạy trơn tru.
Với các ví dụ và các bài học thu được từ một việc chuyển đổi thực tế thành công, bạn sẽ thấy đây
có thể là một dự án đơn giản, có đủ tài liệu và cung cấp các lợi ích hấp dẫn.
Loạt bài bốn phần này chia sẻ các bài học nhận được từ cuộc di trú MySQL-sang-DB2 thành
công cho một ứng dụng mạng nội bộ PHP trọng yếu, cấp độ sản xuất, được 4.000 người dùng
toàn cầu trong IBM sử dụng để hỗ trợ sản xuất nội dung cho ibm.com.
Phần 1 mô tả các bước cần thực hiện để chuẩn bị cho việc di trú.
Phần 2 mô tả các bước cần thực hiện để di trú cơ sở dữ liệu.
Phần 3 mô tả các bước cần thực hiện để chuyển đổi mã PHP.
Phần 4 mô tả các bước cần thực hiện để triển khai và hỗ trợ ứng dụng.
Bạn sẽ học được những gì
Mục đích của loạt bài này là cho bạn hiểu những gì thường cần thiết để di trú một ứng dụng PHP
từ MySQL sang DB2, những tài nguyên nào có sẵn để trợ giúp bạn và một nhóm dự án của IBM
đã thực hiện nhiệm vụ này vào đầu năm 2010 như thế nào.
Nếu bạn đã nghiên cứu một cuộc di trú từ MySQL sang DB2, bạn có thể đã thấy những giá trị
mà DB2 cung cấp dựa trên tài liệu sản phẩm, các đánh giá tiêu chuẩn về hiệu năng, các tính năng
mà bạn đã đọc trong tài liệu DB2, hoặc các so sánh trong các Sách Đỏ của IBM (IBM Redbooks
®) dành riêng cho nhiệm vụ này, bao gồm cuốn Hướng dẫn chuyển đổi MySQL sang DB2 (xem
phần Tài nguyên ).
Bạn có lẽ cũng biết rằng DB2 Express-C là một máy chủ dữ liệu quan hệ có đủ chức năng, miễn
phí có thể dễ dàng được cài đặt hoặc được đánh giá bằng cách sử dụng IBM SmartCloud (tên cũ
là Development and Test on the Cloud - Phát triển và Thử nghiệm trên Đám mây của IBM) hoặc
Amazon EC2. Các liên kết đến các tài nguyên này có sẵn trong phần Tài nguyên.
Loạt bài này cung cấp cho bạn một ví dụ cụ thể về cuộc di trú thực tế đã được thực hiện thành
công như thế nào trong năm 2010 cho một ứng dụng mạng nội bộ PHP được sử dụng rất nhiều
trong IBM để hỗ trợ quản lý nội dung hàng ngày được công bố trên nhiều phần của trang Web
ibm.com.
Sau khi bạn đọc xong loạt bài này, bạn sẽ có thể tạo một trường hợp di trú tương tự, hiểu được
thời hạn và các phụ thuộc của các mục công việc cần được thực hiện, dự kiến các rủi ro tiềm
năng, và biết nơi để tìm kiếm sự hỗ trợ từng bước trên đường đi. Tất cả điều này sẽ cho bạn sự tự
tin hơn để lựa chọn DB2 và sử dụng nó một cách tốt nhất cho các ứng dụng PHP của bạn hiện
đang được phát triển trên MySQL.
Những gì không trình bày
Loạt bài này nhằm chia sẻ các bài học thu được từ một cuộc di trú nội bộ IBM từ MySQL sang
DB2 và cung cấp cho bạn thông tin về tài nguyên có sẵn để thực hiện một công cuộc tương tự.
Loạt bài này không phải là một hướng dẫn toàn diện về di trú để có thể áp dụng được cho tất cả
các kịch bản.
Để xác định một cách tiếp cận phù hợp với bạn, hãy tham khảo Hướng dẫn chuyển đổi MySQL
sang DB2 hoặc liên hệ với SMPO (Software Migration Project Office - Văn phòng dự án di trú
phần mềm) để đánh giá di trú miễn phí. Các liên kết này được cung cấp trong phần Tài nguyên.
Về đầu trang
Giới thiệu về việc di trú mã
Bài này trình bày năm bước làm việc chính trong một nghiên cứu chi tiết để thực hiện di trú mã
ứng dụng PHP từ chỗ đang sử dụng các trình điều khiển và cú pháp MySQL tới chỗ làm việc với
DB2. Nếu cần, hãy tham khảo Phần 1 của loạt bài này để xem lịch trình các bước ấy trong quá
trình di trú tổng thể trước khi tiến hành chuyển đổi.
Bước 1: Bắt đầu bước chuyển đầu tiên trong di trú mã
Đảm bảo cập nhật cấu hình PHP để hỗ trợ DB2.
Cập nhật các câu lệnh SQL riêng lẻ để hỗ trợ cú pháp DB2.
Mô phỏng các hàm MySQL nguyên gốc bằng cách sử dụng các hàm DB2 do
người dùng định nghĩa, nếu cần.
Di chuyển logic xử lý từ SQL vào PHP, nếu cần.
Bước 2: Bắt đầu bước chuyển thứ hai trong di trú mã
Xem xét các thay đổi cần thiết để hỗ trợ các mức cách ly thích hợp.
Tổ chức lại các truy vấn thành các đơn vị công việc logic để đạt được tính toàn
vẹn dữ liệu tốt hơn và cải thiện hiệu năng.
Bước 3: Bắt đầu thử nghiệm trường hợp sử dụng nghiệp vụ khởi đầu với các bên liên quan
Phối hợp các bên liên quan để thực hiện các trường hợp sử dụng đã quen thực
hiện trong hệ thống cũ.
Nắm bắt các thất bại kiểm thử như là các khiếm khuyết cần được các nhà phát
triển phân tích và sửa chữa.
Bước 4: Giải quyết nút nghẽn cổ chai và xác nhận dựa vào vạch chuẩn chức năng
Cải thiện hiệu năng của hệ thống dựa vào sự phản hồi của người dùng sau khi
kiểm tra chức năng.
Tập trung vào những gì DB2 có thể sửa chữa tự động cho bạn, vì DB2 là sự thay
đổi lớn nhất mà bạn đưa vào.
Giải quyết nút nghẽn cổ chai PHP bằng cách xem xét cách sử dụng tài nguyên của
hệ điều hành.
Bước 5: Đánh giá vạch chuẩn di trú mã
Sau khi hoàn thành theo cách lặp lại các bước trên, khai báo hoàn thành việc
chuyển đổi mã.
Sao lưu hệ thống và gắn thẻ mốc quan trọng trong hệ thống kiểm soát mã nguồn
của bạn.
Đánh giá mức độ chuẩn bị cần thiết cho nhiệm vụ tiếp theo: triển khai ứng dụng.
Về đầu trang
Tìm hiểu nghiên cứu chi tiết về ví dụ cơ sở mã PHP của PTT hiện có
Nhắc nhở
Nếu cần, hãy tự mình tìm hiểu phần Tài nguyên có thể giúp ích trong việc di trú của bạn. Các tài
nguyên sau có thể đặc biệt có ích cho bước này:
Chương 8 và 10 trong Sách Đỏ miễn phí của IBM (IBM Redbook ®) Hướng dẫn chuyển
đổi MySQL sang DB2.
Chương 4 và 6 trong Sách Đỏ miễn phí của IBM Phát triển các ứng dụng PHP cho Các
máy chủ dữ liệu IBM.
Bài viết trên developerWorks "Danh sách khuyến khích đọc: Phát triển ứng dụng DB2
cho Linux, UNIX, và Windows".
Các mục blog của Daniel Krook về kinh nghiệm cá nhân của ông trong một dự án di trú
cho một ISV.
Tất nhiên các tài liệu về ngôn ngữ lập trình PHP và phần mở rộng của trình điều khiển DB2 cũng
là các phương tiện cần thiết.
Một lựa chọn khác là sử dụng đám mây cho quá trình di trú. Bạn có thể sử dụng Linux EC2 của
Amazon và các AMI của DB2, hoặc đăng ký dùng IBM SmartCloud (tên cũ là Development and
Test on the Cloud - Phát triển và Thử nghiệm trên Đám mây của IBM)(xem phần Tài nguyên ).
Với ứng dụng ví dụ trong bài này, mã nguồn cho Project Tracking Tool (PTT - Công cụ theo dõi
dự án) bao gồm hàng trăm tệp PHP. Cơ sở mã có các thư viện hàm, mã hướng-đối tượng được tổ
chức thành các đối tượng truyền dữ liệu và các lớp của trình quản lý, các đoạn khuôn mẫu
HTML khác nhau và các trình trợ giúp để biểu hiện giao diện người dùng.
Cơ sở dữ liệu PTT được sử dụng với các hàm khác nhau để hỗ trợ luồng công việc cung cấp
thông tin được công bố trên ibm.com. Hơn 4.000 người dùng trên toàn thế giới truy cập và sửa
đổi cơ sở dữ liệu PTT thông qua mặt tiền web PHP. Tại bất kỳ thời điểm nào, đều có hàng trăm
người dùng đang hoạt động đồng thời trên hệ thống.
Mã này được triển khai vào một máy chủ web Apache, nó nạp tệp mod_php như là một mô đun
chia sẻ.
Trong ví dụ này, mã hiện có đã được cập nhật cho hệ thống DB2 mới, chủ yếu là bằng cách thực
hiện các sửa đổi với SQL nhúng. Các sửa đổi nhỏ khác bắt buộc phải làm là cập nhật cấu hình
PHP để sử dụng trình điều khiển DB2 và điều chỉnh mã kết nối cơ sở dữ liệu, sử dụng một chuỗi
kết nối mới. Bài này cũng xác định và tập trung vào một số cải tiến cấu trúc ứng dụng để hoàn
thiện hơn khung kiến trúc mô hình-khung nhìn-trình điều khiển (MVC) nhằm cải tiến chất lượng,
tổ chức và bảo trì ứng dụng.
Về đầu trang
Cài đặt phần mềm chuyển đổi
Để chuẩn bị cho việc chuyển đổi mã ví dụ, hãy cài đặt các thành phần sau đây trên một máy trạm
Windows được sử dụng để thực hiện các bước chuyển đổi.
Một phiên bản của bản sao MySQL của cơ sở dữ liệu nguồn
Để kiểm tra mỗi thay đổi mã, điều quan trọng là có một bản sao của hệ thống cũ sẵn sàng
để sử dụng làm một tham chiếu chức năng để xác nhận hợp lệ các thay đổi cho hệ thống
mới bên cạnh hệ thống cũ. Bạn có thể sử dụng chính hệ thống như bạn đã làm trong Phần
2.
Một phiên bản DB2 với các trình điều khiển máy chủ dữ liệu được cài đặt cục bộ hoặc trên
một máy chủ thử nghiệm
Cài đặt DB2 để tạo cơ sở dữ liệu đích mới trên máy trạm. Nói chung, cơ sở dữ liệu này
không nhất thiết là ấn bản giống như cơ sở dữ liệu được sử dụng trong sản xuất, nhưng để
tương thích tính năng hoàn toàn, một ý tưởng tốt là nên chọn cùng ấn bản. Để làm theo
các ví dụ trong bài này, hãy cài đặt Ấn bản máy chủ doanh nghiệp của DB2 (DB2
Enterprise Server Edition) Phiên bản 9.7.2. Đảm bảo rằng các trình điều khiển của máy
chủ dữ liệu có sẵn để cung cấp các thư viện khách PHP cần thiết. Bạn có thể sử dụng
chính hệ thống như bạn đã làm trong Phần 2.
Một phiên bản PHP được xây dựng với phần mở rộng ibm_db2 hoặc PDO_IBM (PHP
Data Objects)
Tải về phiên bản mới nhất của Zend Server và chọn phần mở rộng DB2 tùy chọn, có yêu
cầu cài đặt các gói bổ sung.
Một môi trường phát triển tích hợp (IDE), ví dụ Zend Studio hoặc Các công cụ phát triển
PHP (PDT) của Eclipse
Sử dụng một IDE nhận biết-PHP, ví dụ Zend Studio hoặc Các công cụ phát triển PHP của
Eclipse, để dễ dàng phát triển PHP của bạn. Vì bạn duy trì một ứng dụng PHP, nên nhiều
khả năng là bạn đã có một công cụ ưa thích.
Hãy chắc chắn ghi lại chi tiết các quyết định cấu hình và các bài học thu được của bạn để cho
bạn có thể lặp lại các bước khi triển khai. Xem xét việc ghi lưu một ảnh chụp của hệ điều hành
Windows thành một ảnh ảo tại các cột mốc chính mỗi khi đạt được các đích quan trọng để dùng
làm các bản sao lưu cấu hình và các vạch chuẩn để so sánh cải thiện tiếp mã lệnh.
Nếu bạn muốn chụp một ảnh của một cấu hình máy tính vật lý, bạn có thể làm điều đó bằng
VMware vCenter Converter miễn phí. Một cách thay thế khác là xem xét dùng đám mây cho các
thay đổi năng động này. Bạn có thể sử dụng các AMI DB2 cho EC2 của Amazon, hoặc bạn có
thể đăng ký dùng IBM SmartCloud (tên cũ là Development and Test on the IBM Cloud). Với các
máy tính ảo, bạn sẽ có thể tránh được các cố gắng ban đầu để mua phần cứng máy chủ và cài đặt
một hệ điều hành và DB2, điều này sẽ tiết kiệm thời gian, tăng tốc độ di trú, và mang lại cho bạn
sự tự tin để trải nghiệm với cấu hình phù hợp nhất cho các nhu cầu của bạn. Có thể tìm thấy các
liên kết đến tất cả các sản phẩm này trong phần Tài nguyên.
Về đầu trang
Bước 1: Bắt đầu một bước chuyển đầu tiên về di trú mã
Bước chuyển đổi mã quan trọng đầu tiên là cấu hình cơ sở hạ tầng PHP và DB2 mới và chuyển
đổi cách ứng dụng sử dụng PHP và SQL để truy cập dữ liệu. Bước này liên quan đến các bước
nhỏ sau:
Cập nhật cấu hình và trình điều khiển PHP.
Chuyển đổi cú pháp SQL.
Tạo các hàm do người dùng định nghĩa để mô phỏng MySQL.
Di chuyển logic từ SQL vào PHP, nếu cần.
Cập nhật cấu hình và trình điều khiển PHP
Đảm bảo rằng cấu hình PHP hiện có được sửa đổi để hỗ trợ trình điều khiển của DB2, để khớp
với bộ mã hóa ký tự cơ sở dữ liệu máy chủ và để cung cấp các thông báo chẩn đoán quan trọng
thông qua cảnh báo và các thông báo lỗi đầy đủ mọi chi tiết.
Để cập nhật mã PHP cho DB2, bạn sẽ thường thay đổi từng điểm trong mã ở đó các hàm mở
rộng ibm_db2 được sử dụng hoặc cập nhật chuỗi kết nối PDO_IBM để thực hiện giao diện PDO
(Các đối tượng dữ liệu PHP). Nếu bạn sử dụng PDO như một thư viện trừu tượng hóa cơ sở dữ
liệu trong hệ thống dựa trên MySQL của mình, các thay đổi mã của bạn sẽ không đáng kể. Đó
chỉ là vấn đề thay đổi một chuỗi kết nối duy nhất. Nhưng cho dù là bạn đang sử dụng phần mở
rộng thủ tục ibm_db2, nhiệm vụ này cũng đơn giản. Bạn có thể thay thế bình thường bất kỳ các
hàm nào bắt đầu với mysql_ hoặc mysqli_ trong mã của bạn bằng các tiền tố db2_ tương đương.
Xem phần 6.3 Chương 6 về Phát triển các ứng dụng PHP cho các máy chủ dữ liệu của IBM
trong Sách Đỏ của IBM (xem phần Tài nguyên) để biết các bảng ánh xạ tương ứng các hàm và
mã mẫu.
Cả hai phương thức kết nối đều dựa vào máy khách DB2 làm một cầu nối để nối đến máy chủ
DB2, vì vậy bạn cần xác nhận rằng máy khách DB2 đã được cấu hình khớp với các thiết lập trên
máy chủ từ xa. Cụ thể, bạn cần đảm bảo chắc chắn rằng trang mã ký tự của máy khách DB2
giống như trang mã ký tự của máy chủ DB2, nếu không, bạn sẽ gặp khó khăn với các bộ ký tự.
Với ví dụ này, hãy chạy lệnh được hiển thị trong Liệt kê 1 để thiết lập bộ mã hóa ký tự máy
khách là UTF-8, sẽ phù hợp với lệnh CREATE DATABASE trong Liệt kê 1 trong Phần 2.
Liệt kê 1. Thiết lập trang mã máy khách DB2 thành UTF-8
db2set db2codepage=1208
Để đảm bảo thiết lập này được sử dụng trên mỗi máy trạm hoặc các máy chủ mà bạn cài đặt máy
khách thời gian chạy, hãy chạy lệnh trong Liệt kê 2.
Liệt kê 2. Xem các biến cấu hình của DB2
db2set -all
Cuối cùng, trong quá trình phát triển, sẽ rất có ích nếu đảm bảo rằng tất cả các thông báo và các
cảnh báo lỗi được thu giữ và được hiển thị trong trình duyệt. Trong tệp php.ini của bạn, hãy cập
nhật các tham số được hiển thị trong Liệt kê 3. Hãy nhớ đặt chúng trở lại các thiết lập ít dài dòng
hơn khi bạn chuyển sang sản xuất. Phần 4 của loạt bài này cung cấp một ví dụ về một cơ chế báo
cáo lỗi thích hợp hơn để sử dụng khi bạn triển khai vào sản xuất.
Liệt kê 3. Thiết lập các tham số kiểm soát lỗi trong php.ini
display_errors = On
error_reporting = E_ALL & ~E_NOTICE
Chuyển đổi cú pháp SQL
Tiếp theo, hãy cập nhật các câu lệnh SQL riêng lẻ để hỗ trợ cú pháp DB2 hoặc thay đổi chúng để
truy cập dữ liệu theo cách hơi khác một chút để đạt được kết quả tương tự. Đối với hầu hết các
ứng dụng, bước này cần rất nhiều lần cập nhật mã và kiểm tra thử nghiệm. Tham khảo Chương
8.1 các điểm giống nhau và khác nhau của Ngôn ngữ thao tác dữ liệu trong Sách Đỏ Hướng dẫn
chuyển đổi MySQL sang DB2 để xem một danh sách các phép chuyển đổi cú pháp phổ biến. Sau
đây là một vài tình huống trong ứng dụng nghiên cứu chi tiết.
Cách xử lý ký tự đại diện của mệnh đề SELECT
Các câu lệnh SELECT sử dụng một ký tự đại diện (ký tự dấu hoa thị) để chọn cột cụ thể
bên cạnh tất cả các cột của nhiều bảng là hợp pháp trong MySQL, nhưng chúng lại không
được phép trong DB2. Trong trường hợp này, thêm tên bảng (hoặc bí danh) đầy đủ vào
trước ký tự đại diện, chỉ rõ mỗi cột của mỗi bảng mà bạn đang quan tâm đến hoặc đơn
giản là liệt kê tất cả các cột trong mỗi bảng với một ký tự đại diện duy nhất. Liệt kê 4 cho
thấy cách sửa đổi các truy vấn như vậy.
Liệt kê 4. So sánh các ký tự đại diện của cột và bảng hợp pháp trong MySQL và DB2
-- In MySQL:
SELECT R.NAME, *
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID;
-- In DB2:
SELECT R.NAME, U.*
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID;
-- Or
SELECT R.NAME, U.ID, U.NAME, U.ROLE_ID, U.DEPART_ID
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID;
Mệnh đề SELECT quy định cụ thể kích thước tối đa của tập kết quả với LIMIT
LIMIT (Giới hạn) là một từ khóa không chuẩn, chỉ duy nhất của MySQL quy định cụ thể
số lượng tối đa các hàng được trả về từ một truy vấn. DB2 sử dụng cú pháp FETCH FIRST
n ROWS ONLY cho cùng một mục đích. Liệt kê 5 cho bạn thấy cách viết lại truy vấn với
DB2.
Liệt kê 5. Quy định số lượng tối đa các hàng được trả về từ một truy vấn trong MySQL và
DB2
-- In MySQL:
SELECT * FROM ROLE LIMIT 10;
-- In DB2:
SELECT * FROM ROLE FETCH FIRST 10 ROWS ONLY;
Mệnh đề GROUP BY
MySQL cho phép sử dụng một mệnh đề GROUP BY không chỉ rõ từng tên cột không
được sử dụng bởi một hàm tổng hợp trong danh sách cột. Nhưng trong DB2, điều này là
không hợp lệ, vì tập kết quả có thể có mức mơ hồ không thể chấp nhận được đối với
nhiều người sử dụng. Liệt kê 6 cho thấy cách quy định rõ các cột trong truy vấn với DB2.
Liệt kê 6. So sánh các phép gộp GROUP BY hợp pháp trong MySQL và DB2
-- In MySQL:
SELECT R.ID, R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.ID;
-- In DB2:
SELECT R.ID, MIN(R.NAME), COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.ID;
-- Or
SELECT R.ID, R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.ID, R.NAME;
Trong Liệt kê 6, bạn có thể cập nhật GROUP BY, vì cả hai R.ID và R.NAME là khóa duy nhất
trong bảng này. Liệt kê 7 cho thấy một loại truy vấn GROUP BY khác không thể xử lý đơn giản
như truy vấn trong Liệt kê 6.
Liệt kê 7. GROUP BY không rõ ràng trong MySQL cần được sửa đổi cho DB2
-- In MySQL:
SELECT R.ID, R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.NAME;
Trong trường hợp này, R.ID là duy nhất trong bảng, nhưng R.NAME thì không. Nếu có bản sao
giá trị R.NAME trong bảng ROLE, thì bạn không thể thay thế R.ID bằng MIN(R.ID) và bạn
không thể thêm R.ID vào mệnh đề GROUP BY. Cách bạn chuyển đổi SQL này như thế nào phụ
thuộc vào bạn mong đợi kết quả dạng nào. Liệt kê 8 cho thấy một vài tùy chọn cho tình huống
này.
Liệt kê 8. Truy vấn GROUP BY đã dịch trong DB2
-- In DB2:
-- Option 1, if you want to get same result as what you get in MySQL, the SQL
is:
SELECT (SELECT RL.ID FROM ROLE RL WHERE RL.NAME = R.NAME FETCH FIRST 1 ROW
ONLY) AS ID,
R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.NAME;
-- Option 2, if role name is same, treat it as same role. In this case,
-- the result is a little different from MySQL version in that there is no
R.ID:
SELECT R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.NAME;
-- Option 3, if role ID is different, treat them as different role.
-- In this case, the result is totally different than the MySQL version:
SELECT R.ID, R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.ID, R.NAME;
REPLACE INTO trong MySQL so với MERGE trong DB2
MySQL cung cấp một mệnh đề REPLACE INTO. DB2 cung cấp một mệnh đề MERGE
cho một mục đích tương tự, nhưng không tương đương. Để đạt được kết quả tương
đương, hãy tạo ra một bản ghi mới hoặc thay thế một bản ghi hiện có nếu nó có khóa
chính giống nhau hoặc giá trị duy nhất. Liệt kê 9 cho thấy cách kiểm tra một giá trị duy
nhất trong bảng và hoặc cập nhật hoặc chèn các giá trị.
Liệt kê 9. Dịch cú pháp REPLACE INTO của MySQL sang DB2
-- In MySQL:
REPLACE INTO ROLE (ID, NAME, DESCRIPTION)
SELECT ID, NAME, DESCRIPTION
FROM ROLE_TMP;
-- In DB2:
MERGE INTO ROLE R
USING (SELECT ID, NAME, DESCRIPTION FROM ROLE_TMP) RT
ON (R.ID = RT.ID)
WHEN MATCHED THEN
UPDATE SET (ID, NAME, DESCRIPTION) = (RT.ID, RT.NAME, RT.DESCRIPTION)
WHEN NOT MATCHED THEN
INSERT (ID, NAME, DESCRIPTION) VALUES (RT.ID, RT.NAME, RT.DESCRIPTION);
Mệnh đề JOIN
Khi thực hiện một phép nối (join) ngoài với một cặp bảng đồng thời cũng lấy ra dữ liệu
từ một bảng thứ ba, hãy chỉ rõ các bảng được sử dụng cho phép nối ngoài kề ngay bên
cạnh các từ khóa JOIN trong DB2. MySQL cho phép chúng được liệt kê theo bất kỳ thứ
tự nào. Liệt kê 10 cho thấy sự thay đổi cần thiết.
Liệt kê 10. So sánh cú pháp JOIN của MySQL và DB2
-- Both of the following work in MySQL:
SELECT *
FROM USER U, ROLE R
LEFT JOIN DEPARTMENT D
ON U.DEPT_ID = D.ID;
-- Or
SELECT *
FROM ROLE R, USER U
LEFT JOIN DEPARTMENT D
ON U.DEPT_ID = D.ID;
-- Only this one works in DB2:
SEL