30/09/2018, 18:39

Insert vào 2 bảng cùng lúc

Mọi người ơi, em đang làm form hóa đơn có mã hóa đơn, ngày lập, nhân viên , tên những sản phẩm mua trong hóa đơn
Như vậy trong csdl sẽ có 3 bảng là HoaDon(mahd, ngaylap) , NhanVien(manv, tennv) , và ChiTietHoaDon (soluong, dongia)

Nó đều nằm cùng trên 1 form nên em không biết insert dữ liệu cùng 1 lúc nhiều bảng cha con vào csdl, nên mong mọi người giúp em.

Dương Tiến Thịnh viết 20:48 ngày 30/09/2018

Mình nghĩ đây không hẳn là insert cùng lúc đâu. Nếu là mình thì mình sẽ xử lý tuần tự như sau.

  1. Insert bảng hóa đơn.=> lấy được mã hóa đơn.
  2. Lấy mã nhân viên xử lý đơn hàng.
  3. Insert vào bảng chi tiết hóa đơn lần lượt từng bản ghi theo mặt hàng.
Khiem Nguyen viết 20:48 ngày 30/09/2018

bạn nên thiết kế lại như sau thì sẽ hợp lý hơn

bảng NhanVien(manv, tennv)
bảng HoaDon(mahd, ngaylap, manv)
bang ChiTietHoaDon(machitiethoadon, mahd, soluong, dongia)

Trước tiên bạn Insert dữ liệu vào bảng HoaDon và sau đó ở SQL Server bạn sử dụng SELECT SCOPE_IDENTITY() để lấy mahd vừa insert vào để gọi lên và tiếp tục insert vào bảng ChiTietHoaDon

Phạm Đại Nghĩa viết 20:49 ngày 30/09/2018

Mình đang phân vân tại sao bảng HoaDon và bảng ChiTietHoaDon lại bị tách ra. Hơn nữa lại không có khóa ngoại để biệt là quan hệ của 2 bảng này với nhau là gì nữa. Vì sao bạn không dùng 1 bảng HoaDon(MaDH, NgayLap, SoLuong, DonGia, MaNhanVien). Khi bạn giải được bài toán tối ưu CSDL thì việc insert 1 lúc nhiều bảng sẽ không còn nữa vì mình đoán NhanVien bạn có sẵn rồi, chỉ insert ở 2 bảng kia thôi.

Còn việc insert cùng lúc vào nhiều bảng(cũng có nhiều TH phải làm thế này) thì bạn hiểu hơi sai vấn đề 1 chút. Đó là ở 1 thời điểm bạn chỉ nên(ở hầu hết các ngôn ngữ thì bạn CHỈ ĐƯỢC) insert 1 bảng thôi và thực hiện tuần tự cho đến khi dữ liệu của bạn đã được lưu đầy đủ trong DB.

VD: ở 1 form khi submit cần xử lý và insert dữ liệu vào bảng A, B và update dữ liệu ở bảng C. Lúc này bạn phải dựa vào dữ liệu ràng buộc của bảng để xác định cần insert A, B trước. Tuy nhiên mình sẽ nói đơn giản ở mức ko có ràng buộc hoặc mặc định mình đã đúng ở bước xác định ràng buộc:

function process_form_XXX(){
B1. Insert dữ liệu vào bảng A, lấy ID của bảng A để sử dụng cho việc insert ở bảng B(nếu cần)
B2. Insert dữ liệu vào bảng B, lấy ID của bảng B để sử dụng cho việc update ở bảng C(nếu cần)
B3. Update dữ liệu vào bảng C
}

Vậy function có tên process_form_XXX sẽ đáp ứng nhu cầu “cùng lúc” của bạn mặc dù trên thực tế nó chạy tuần tự từng yêu cầu nhỏ. Chứ ko có kiểu “cùng lúc” như bạn hiểu đâu.

Nguyen Ca viết 20:48 ngày 30/09/2018

Cứ insert tuần tự từng table, đối với HD và CTHD thì đưa vào 1 transaction.

Khiem Nguyen viết 20:40 ngày 30/09/2018

1 Hóa đơn bên trong nó sẽ có nhiều chi tiết vì thế nên việc tách ra bảng HoaDon va ChiTietHoaDon là đúng ở trường hợp này. Còn làm như bạn thì 1 MaDH chỉ có 1 sản phẩm mà thôi.

stackoverflow.com
Quest Monger

design a database for a shopping-cart application?

database, design, database-design, shopping-cart
asked by Quest Monger on 07:17AM - 03 Feb 12
Jonly Tran viết 20:48 ngày 30/09/2018

Cám ơn các bạn đã chỉ mình. Nhưng vấn đề ở đây là khi mình bấm nó lưu thì nó sẽ lưu cùng lúc bảng hoá đơn vs chi tiết hoá đơn vs nhau lun á.

Nhưng mình nghĩ cách đó khong được vì bảng cha là hoá đơn chưa nhập thì sao bảng con là chi tiết hoá đơn lưu được. Mình khong biết phải làm sao cho đúng .

Vô Danh viết 20:41 ngày 30/09/2018

Insert cùng 1 lúc như mong muốn của bạn là không thể với lại từ mã hóa đơn làm sao tìm được chi tiết hóa đơn?? Bạn phải chỉnh lại CSDL trước đã vì cả 3 bảng đều chưa có mối quan hệ nào hết bạn có thể thêm ở bảng ChiTietHoaDon trường mahd, manv.
Nếu mã HĐ là do tự nhập thì bạn cứ lấy mã đó insert vào bảng HoaDon trước rồi tới ChiTietHoaDon.
Nếu không cho tự nhập thì khi load form bạn sinh ra mã HĐ trước có thể cho hiển thi lên field Mã HĐ: rồi lấy insert vào.

Jonly Tran viết 20:54 ngày 30/09/2018

Mã hóa đơn của mình là nhập tự động. Vậy là khi tạo hóa đơn mới, mã hđ sẽ tự động. Nhưng mình ko biết cách insert mã hd vào bảng hóa đơn rồi lasy mã hđ insert vào bảng chi tiết hđ

Jonly Tran viết 20:47 ngày 30/09/2018

Vấn đề là mình không biết viết code lấy khóa sao á. Mình mún là bấm nút lưu là nó lưu hết. Nhưng theo code là lưu mahd , ngay lap trước trong bảng hoasdon, Sau đó lấy khóa mahd và thêm dữ liệu vào bảng chi tiết hóa đơn. Mình hiểu là theo trình tự vậy như mình không biết viết lệnh sql làm sao

Phạm Đại Nghĩa viết 20:50 ngày 30/09/2018

Bạn nhìn thiết kế theo post đầu tiên của bạn ấy trước đã. Ở đó rõ ràng ko có khóa ngoại để nói lên quan hệ 1-n giữa bảng HoaDon và ChiTietHoaDon. Cũng ko nói nghiệp vụ nên mình thiết kế lại kiểu đơn giản thôi.

Với lại trong trường hợp này bạn ấy nên thiết kế quan hệ n-n chứ ko phải 1-n vì 1 hóa đơn có thể có nhiều món và 1 món có thể được đặt ở nhiều hóa đơn.

Jonly Tran viết 20:52 ngày 30/09/2018

Vậy thì mình phai lam sao cho đúng bạn

Khiem Nguyen viết 20:53 ngày 30/09/2018

cái vụ 1 sản phẩm cũng có nhiều hóa đơn thì mình mới nghe lần đầu. vì trước h làm shopping cart mình chỉ làm 1 chi tiết hóa đơn có nhiều sản phẩm, chứ chưa bao h làm một sản phẩm có nhiều hóa đơn nghe hơi lạ.

bạn @xuxutrinh có thể tham khảo theo database bên dưới cũng khá chuẩn.

Phạm Đại Nghĩa viết 20:44 ngày 30/09/2018

Mình chỉ nói đến phần hóa đơn thôi nhé
Bạn có bảng món ăn rồi. giờ bạn tạo bảng hóa đơn với các trường: MaHD, MaKH, MaNhanVien, NgayTaoHD
Rồi sau đó bạn tạo bảng HoaDon_MonAn với các trường: MaDH, MaMonAn

Sau đó dùng JOIN của SQL để lấy ra HoaDon và các MonAn mà hóa đơn đó có.

Phạm Đại Nghĩa viết 20:46 ngày 30/09/2018

Thế mà có đấy. Bạn nhìn xem, 1 món ăn có thể được đặt bởi nhiều hóa đơn và 1 hóa đơn thì có nhiều món ăn. Có gì không hợp lý đâu?

Khiem Nguyen viết 20:42 ngày 30/09/2018

bạn có thấy bạn @xuxutrinh đang thiết kế database theo kiểu một nhiều không ?

Phạm Đại Nghĩa viết 20:43 ngày 30/09/2018

Ờ ha, Xuxutrinh làm đúng rồi còn gì

Lúc đầu ko thấy có cái bảng này nên mình ko thấy khóa.

Jonly Tran viết 20:46 ngày 30/09/2018

Vấn đề là mình hk bik viết cau lệch sql trong php lam sao á. @khiemnvd và @kyllynk chỉ mình với

Khiem Nguyen viết 20:54 ngày 30/09/2018

bạn có hiểu khái niệm quan hệ nhiều nhiều. trên thực tế là bạn nói như vậy là đúng nhưng khi đưa vào thiết kế một ứng dụng thì khi có 2 bảng cùng quan hệ nhiều nhiều thì bạn phải phát sinh ra thêm 1 bảng trung gian giữa 2 bảng. Bạn có thể tham khảo slide bên dưới

slide trang số 16 và 17 nhé.

slideshare.net

Bài 2: Các khái niệm trong CSDL quan hệ - Giáo trình FPT

Tìm hiểu các bước thiết kế CSDL quan hệ Tìm hiểu các khái niệm trong thiết kế CSDL quan hệ: Các khái niệm trong thiết kế CSDL mức khái niệm Các khái niệm trong…

Phạm Đại Nghĩa viết 20:55 ngày 30/09/2018

Mình đang nghĩ đến 2 bảng monan va hoadon. Bạn xem thiết kế ở trên xem. Đúng hơn là mình bị lẫn khi xxt cần giải quyết 2 bảng hoadon va chitiethoadon thì mình lại bày cách thiết kế cho 2 bảng monan va hoadon.

Nhưng vấn đề trong topic này ko phải của mình mà của xxt. Làm thế nào để xử lý khi insert vào DB cơ.

@xuxutrinh: Mình ko làm SQL lâu lắm rồi nhưng trong PHP hoặc bất cứ ngôn ngữ nào có driver để kết nối với MySQL hoặc SQL Server, khi insert 1 bảng vào DB cái function insert đó sẽ return về dữ liệu của row vừa insert hoặc ít nhất là ID của row vừa insert.

Bạn insert HoaDon vào trước rồi lấy ra ID sau đó đọc từng món ăn của hóa đơn đó rồi insert vào chitiethoadon với ID của HoaDon vừa lấy được ở bước trước.

Jonly Tran viết 20:50 ngày 30/09/2018

Nhưng trong form hoá đơn của mình chỉ có 1 nút lưu cho tổng thể thui à. Với lại do mình khong biết cú pháp lấy mã HD nên mình làm hk ra

Bài liên quan
0