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
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
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.
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.
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.
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 –
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' :) –
- 1. Có thể tuần tự hóa khối mã C# không?
- 2. Kiểm tra mã hóa tuần tự
- 3. Chèn mã html vào bảng mysql
- 4. phương pháp để tuần tự hóa các bảng lua
- 5. Không thể chèn ký tự ♥ vào bảng MySQL
- 6. Mysql chọn nơi không có trong bảng
- 7. sơ đồ tuần tự
- 8. Lắp ráp tuần tự hóa. Có cần thiết hay không?
- 9. Tuần tự hóa có lưu các trường siêu lớp không?
- 10. Tại sao một lớp bên trong tuần tự không thể tuần tự hóa được?
- 11. Không thể tạo bảng có ký tự unicode trong tên
- 12. XMlSerialization không tuần tự hóa một datetime
- 13. Mysql thay đổi bảng mã mặc định thành bộ ký tự cơ sở dữ liệu
- 14. Nối tiếp một đối tượng có lớp cha không tự tuần tự
- 15. Không thể tuần tự hóa dưới dạng ActiveSupport :: HashWithIndifferentAccess nữa
- 16. MySQL sửa các khoảng trống tự động trong hai bảng
- 17. Có thể tự chọn lệnh trong truy vấn mysql không?
- 18. Thư viện tuần tự Erlang
- 19. Lưu trữ một đối tượng được tuần tự hóa trong cơ sở dữ liệu MySql
- 20. Có cần thả các bảng tạm thời trong mysql không?
- 21. Regex/mã để sửa lỗi dữ liệu PHP được tuần tự hóa bị lỗi
- 22. PHP & MySql kiểm tra xem bảng có trống không
- 23. kí tự đặc biệt trong bảng MySQL Tên
- 24. MySQL Tạo Bảng Lỗi - Bảng Không tồn tại
- 25. Có thể tự động tuần tự hóa đối tượng C++ không?
- 26. Phần tử lược đồ tuần tự có đảm bảo thứ tự các phần tử con không?
- 27. PostgreSQL và tuần tự dữ liệu
- 28. MySQL: nhiều bảng hoặc một bảng có nhiều cột?
- 29. Có cách nào dễ dàng để chọn một hàm python (hoặc nếu không thì tuần tự mã của nó)?
- 30. Xem Bảng tạm thời MySQL - Không có trong phiên
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 –