MySQL - Bảng thay đổi để tự động đặt vào UUID


14

Ok, tôi biết tôi đã làm điều này trước đây. Nhưng tôi không thể cho cuộc sống của tôi tìm ra nó. Tôi đã tạo ra một bảng. Một trong những cột được ghi là "LogID", nó cũng là khóa chính.

Làm cách nào để thay đổi nó để cột này tạo UUID cho mỗi mục nhập mới?

Cảm ơn

Câu trả lời:


17

Chỉ cần tạo một kích hoạt để chạy trước khi chèn để tạo UUID cho cột đã cho.

CREATE TRIGGER before_insert_mytable
  BEFORE INSERT ON mytable
  FOR EACH ROW
  SET new.LogID = uuid();

3

Biểu thức UUID () tạo UUID khi được gọi.

Thật không may (dù sao AFAIK) MySQL sẽ không cho phép các biểu thức làm giá trị mặc định cho một trường. Như một công việc xung quanh, bạn luôn có thể đặt trường thành null mặc định và có một trình kích hoạt cập nhật trường bằng UUID khi chèn.


2

Tôi khá chắc chắn rằng bạn vẫn không thể , thực sự. Tôi nghiêm túc xem xét việc không sử dụng UUID làm khóa chính, thay vào đó sử dụng kiểu dữ liệu mỏng hơn, đẹp hơn như thế INT. Bạn có thể thêm UUID của bạn dưới dạng một cột riêng và cập nhật nó qua một TRIGGER, nếu phù hợp với bạn.


Số nguyên bị hỏng nếu bạn cần các bản ghi là duy nhất trên cơ sở dữ liệu của bạn.
Cfreak

1
Tôi nghi ngờ có một thiết kế mô hình lớn hơn hoặc vấn đề công cụ được chọn nếu các yêu cầu đang áp đặt mô hình lưu trữ động cơ ở mức đó. Có UUID là một cột riêng biệt thực sự là một giải pháp tốt nhất của cả hai thế giới trong trường hợp này.
Avarkx

UUID bị đầy hơi một khi được định dạng cho con người. Nếu bạn muốn sử dụng UUID làm khóa chính thì hãy xóa dấu gạch ngang và mở khóa nó. Nếu bạn cần phiên bản được định dạng của con người, bạn có thể thêm một cột được tạo vào bảng. SELECT LENGTH(UNHEX(REPLACE(UUID(),'-','')))= 16 byte nhị phân. Vẫn lớn hơn INTnhưng tốt hơn nhiềuVARCHAR(36)
miknik

Lời khuyên tồi, miknik. Cơ sở dữ liệu của bạn sẽ mở rộng quy mô khủng khiếp nếu bạn sử dụng UUID làm khóa chính. Cũng có thể có 16 cột số nguyên riêng biệt làm khóa chính ghép. Và chỉ số phân mảnh galore! Khóa chính của bạn bây giờ là ngẫu nhiên. Nếu bạn làm như vậy, không sử dụng khóa nước ngoài. Tham gia thay đổi từ O (n) thành O (n ^ 2). Hai tham gia từ O (n log10 (n)) đến O (n ^ 3). Thay n bằng 100.000 và trừ đi phần chênh lệch.
TamusJRoyce

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.