2011-09-27 36 views
5

Có cách nào để tạo bảng trong MySql có bảng ID tự động không, nhưng ID không phải là tuần tự. Ví dụ, một ngẫu nhiên hoặc giả ngẫu nhiên ID. Tôi đã tìm thấy các giải pháp đề xuất tạo ID và cố gắng chèn nó cho đến khi ID không sử dụng được tìm thấy (generating an sequential five digit alphanumerical ID). nhưng không có gì có thể được thực hiện trực tiếp trong định nghĩa bảng hoặc một mẹo đơn giản hơn.Bảng MySql không có mã tuần tự

Trả lời

11

MySQL có một chức năng có nguồn gốc UUID() mà sẽ tạo ra một Globally Unique Identifier:

mysql> SELECT UUID(); 
    -> '6ccd780c-baba-1026-9564-0040f4311e29' 

Bạn có thể lưu trữ sản lượng của nó trong một cột CHAR(36).

INSERT INTO table (`uuid`, `col1`, `col2`) VALUES (UUID(), 'someval', 'someval'); 

Theo tài liệu, mặc dù

Mặc dù UUID() giá trị nhằm mục đích là duy nhất, họ không nhất thiết phải unguessable hoặc không thể đoán trước. Nếu không thể đoán trước được yêu cầu, các giá trị UUID sẽ được tạo theo một cách khác.

Phụ Lục lựa chọn khác là UUID_SHORT() cho 64-bit unsigned INT chứ không phải là một lĩnh vực nhân vật.

mysql> SELECT UUID_SHORT(); 
    -> 92395783831158784 
2

Khóa tổng hợp có hoạt động không? Trường auto_increment chuẩn thông thường. Bạn chèn bản ghi mới của bạn, lấy ID mới của nó, sau đó băm ID đó bằng muối và cập nhật bản ghi với giá trị băm đó.

Nếu bạn làm điều này tất cả trong một giao dịch, phiên bản ghi tiến trình đang diễn ra mà không có băm sẽ không bao giờ được hiển thị cho đến khi băm được tạo. Và giả sử bạn đã thực hiện việc trộn muối thích hợp, giá trị băm kết quả sẽ là cho tất cả các ý định và mục đích 'ngẫu nhiên'.

Lưu ý rằng bạn không thể làm điều này trong một bước, vì giá trị của last_insert_id() trong mysql không được cập nhật với id mới cho đến khi bản ghi thực sự được ghi. Giá trị được truy xuất trong giai đoạn chèn parseing thực tế sẽ là bất kỳ id nào được chèn TRƯỚC KHI định dạng này.

1

Chỉ mặc định được tạo tự động trong định nghĩa bảng cho phép sẽ là tự động tạo (MySQL Guide).

Bạn có thể write a trigger để tự động hoá quy trình này, có thể thông qua chức năng UUID như Michael đã đề xuất.

+0

từ nhận xét đầu tiên của liên kết của bạn TẠO TRIGGER sdata_insert TRƯỚC KHI CHERTN TRÊN ĐÂY CHO MACHI ROW BEGIN THIẾT LẬP NEW.guid = UUID(); END –

3

Kể từ khi bạn yêu cầu một thủ thuật, bạn có thể sử dụng một id auto_incremented chung và "giả" nó bằng cách nhân với số nguyên tố lớn (và sau đó theo modulo 2^32): giá trị

CREATE TABLE AutoIncPrime 
(id int unsigned auto_increment primary key 
) ; 

Insert, từ 1 10:

INSERT INTO AutoIncPrime 
VALUES(),(),(),(),(),(),(),(),(),() ; 

SELECT * FROM AutoIncPrime ; 

Output:

id 
--- 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Fake các id, với một Xem:

CREATE VIEW AutoIncPrime_v AS 
    SELECT 
     ((id*1798672429) & 0xFFFFFFFF) 
      AS FakeUUID 
    FROM AutoIncPrime ; 

Cho phép xem "UUIDs" của chúng tôi:

SELECT * FROM AutoIncPrime_v ; 

Output:

FakeUUID 
---------- 
1798672429 
3597344858 
1101049991 
2899722420 
403427553 
2202099982 
4000772411 
1504477544 
3303149973 
806855106 

Bạn thậm chí có thể làm cho nó trông ngẫu nhiên hơn với (phức tạp hơn bit mixing) :

CREATE VIEW AutoIncPrime_v2 AS 
    SELECT 
     ( (((id*1798672429) & 0x55555555) << 1) 
      | (((id*1798672429) & 0xAAAAAAAA) >> 1) 
     ) 
     AS FakeUUID 
    FROM AutoIncPrime ; 

SELECT * FROM AutoIncPrime_v2 ; 

FakeUUID 
---------- 
2537185310 
3918991525 
2186309707 
1558806648 
604496082 
1132630541 
3719950903 
2791064212 
3369149034 
808145601 

Bí quyết là bạn vẫn có một id tuần tự trong bảng - mà bạn có thể sử dụng để tham gia vào các bảng khác. Bạn chỉ không hiển thị nó cho người dùng - nhưng chỉ hiển thị một giả.

Nếu bảng lớn và tính toán chậm, bạn có thể thêm cột khác trong bảng và lưu giá trị FakeUUID ở đó bằng trình kích hoạt INSERT.

+0

tuyệt vời !!! Tôi đã suy nghĩ về phương pháp này, nhưng với các chức năng tồi tệ nhất (phức tạp hơn và không phải mysql), vì vậy bạn cho tôi một con trỏ. Nhưng a) Tôi không thể nhìn thấy ngược lại để các ID thực sự (mà không chèn nó với một kích hoạt như bạn nói) bạn có thể xin vui lòng gửi ngược lại các chức năng đáng yêu này? và b) những gì về tính duy nhất của các ID được tạo ra (trong một phạm vi nhất định, tất nhiên)? Tôi không thể hình dung phạm vi này cho các hàm này, liên quan đến mặt nạ và phần tử được chọn. thực sự cảm ơn, và lý do tiếng Anh của tôi –

+0

Tôi sẽ cố gắng viết các chức năng ngược lại tối nay. Tính duy nhất được đảm bảo, nếu bạn sử dụng một số nguyên tố, như '1798672429' :) –

Các vấn đề liên quan