2011-06-17 38 views
5

Bảng db của tôi trông giống như pic này. http://prntscr.com/22z1nSự cố với cột "id" được tăng tự động

Gần đây tôi đã tạo trang delete.php. nó hoạt động đúng nhưng khi tôi xóa người dùng lần thứ 21, người dùng đăng ký kế tiếp nhận được ID thứ 24 thay vì 21.

Có thể đặt thông tin người dùng mới đăng ký vào hàng trống đầu tiên không? (Trong trường hợp này hàng thứ 21)

Trong mẫu đăng ký của tôi, người dùng mới đăng ký có thể viết tên của người dùng hiện có và trở thành bạn bè với họ sau khi đăng ký. Đối với tình bạn này, tôi có một bảng khác liên kết id của người dùng mới được đăng ký và người dùng hiện có.

Vì mục đích này, tôi đang sử dụng mysql_insert_id trong quá trình đăng ký để lấy id cho người dùng mới. Nhưng sau khi xóa hàng thứ 21 trong quá trình đăng ký nex mysql_insert_id đã cho tôi số 21. nhưng được lưu trữ trong hàng thứ 24. Và đưa vào các hiệp hội bảng 21 cho người dùng mới. Tôi muốn giải quyết vấn đề này

+0

Bạn có thể hiểu nhầm 'mysql_insert_id()'. Nó trả về id LAST được chèn vào. Gọi nó nhiều lần sẽ luôn luôn trả lại cái cuối cùng, không bao giờ là cái tiếp theo. Giá trị của nó sẽ không thay đổi cho đến SAU KHI một lần chèn khác đã được hoàn tất. –

Trả lời

2

Cột MySQL auto_increment duy trì một số nội bộ và sẽ luôn tăng lên, ngay cả sau khi xóa. Nếu bạn cần điền vào một khoảng trống, bạn phải tự xử lý nó trong PHP, thay vì sử dụng từ khóa auto_increment trong định nghĩa bảng.

Quay trở lại để điền vào các id hàng trống có thể gây ra tất cả các loại khó khăn nếu bạn có mối quan hệ khóa ngoại để duy trì, và nó thực sự không được khuyên.

Có thể đặt lại auto_increment bằng cách sử dụng câu lệnh SQL, nhưng điều này không được thông báo vì nó sẽ gây ra lỗi khóa trùng lặp.

-- Doing this will cause problems! 
ALTER table AUTO_INCREMENT=12345; 

EDIT Để thực thi các mối quan hệ chính nước ngoài của bạn như được mô tả trong các ý kiến, bạn nên thêm vào định nghĩa bảng của bạn:

FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL; 

Fill trong bảng và cột tên chính xác. Bây giờ, khi người dùng bị xóa khỏi đăng ký, liên kết bạn bè của họ bị hủy. Nếu bạn cần liên kết lại với một người dùng khác, điều đó phải được xử lý bằng PHP. mysql_insert_id() không còn hữu ích nữa.

Nếu bạn cần tìm id được đánh số cao nhất vẫn còn trong cơ sở dữ liệu sau khi xóa để liên kết với bạn bè, hãy sử dụng như sau.

SELECT MAX(id) FROM registration_table; 
+0

tôi có thể làm điều đó với mysql_insert_id không? –

+0

@Tural Teyyuboglu: mysql_insert_id() lấy id của lần chèn cuối cùng. Nếu bạn tăng và lưu trữ giá trị đó, bạn có thể sử dụng lại giá trị đó cho lần chèn tiếp theo của mình. Mặc dù điều này sẽ không cần thiết, bởi vì bạn đã biết id bạn đã sử dụng trong lần chèn cuối cùng. –

+0

@Tural Teyyuboglu Không, vì 'mysql_insert_id' sẽ chỉ truy xuất ID được sử dụng cuối cùng. –

3

Khi bạn sử dụng cột id tự động, giá trị mà mục nhập tiếp theo sẽ được chỉ định sẽ không bị giảm bằng cách xóa mục nhập. Đó không phải là những gì một cột autoincrement được sử dụng cho. Công cụ cơ sở dữ liệu sẽ luôn tăng số đó trên một chèn mới và không bao giờ giảm số đó khi xóa.

2

Tăng tự động là khóa trình tự được theo dõi như một phần của bảng. Nó không quay trở lại khi bạn xóa một hàng.

+1

hãy giúp tôi nhận ra ý tưởng của tôi –

1

Dễ dàng, không. Những gì bạn có thể làm (nhưng tôi không đề nghị làm) là tạo một hàm SQL để xác định số thấp nhất hiện không bị chiếm đóng. Hoặc bạn có thể tạo một bảng ID đã bị xóa và nhận số nhỏ nhất từ ​​đó. Hoặc, và đây là ý tưởng tốt nhất, bỏ qua những khoảng trống và nhận ra cơ sở dữ liệu là tốt.

1

Điều bạn muốn làm là đạt được bằng cách thêm cột bổ sung vào bảng của bạn được gọi là thứ gì đó như user_order.Sau đó bạn có thể viết mã để quản lý chèn và xóa để cột này luôn luôn tuần tự mà không có khoảng trống.

Bằng cách này bạn tránh được các vấn đề mà bạn có thể gặp phải với cột auto_increment.

1

Nó không phải là một thực hành tốt để thiết lập lại giá trị auto_increment, nhưng nếu bạn thực sự cần phải làm điều đó, vì vậy bạn có thể:

ALTER TABLE mytable AUTO_INCREMENT = 1; 

Chạy truy vấn này sau mỗi lần xóa. Giá trị Auto_increment sẽ không được đặt thành 1, giá trị này sẽ tự động đặt giá trị thấp nhất có thể.

+1

tại sao bạn nghĩ rằng đó là bot tốt? –

+0

@Tural, Hãy hình ảnh bạn có table1 và table2. table2 có một khóa foreigh để table1. Giả sử bạn xóa một cái gì đó từ table1 và sau đó thêm một hàng mới vào cùng một bảng. Vì vậy, hàng mới nhận được cùng một id như hàng đã xóa. Nhưng bây giờ chúng ta có thể có một tình huống khi một hàng trong table2 trỏ đến hàng mới của chúng ta trong table1. Trước đó hàng này chỉ vào hàng đã xóa của chúng tôi và bây giờ nó trỏ đến một hàng mới. Vì vậy, như bạn có thể thấy điều này là OK. – Karolis

+0

@Tural, xin lỗi, trong câu cuối cùng của tôi, tôi muốn nói rằng điều này là KHÔNG OK. Nhưng tôi nghĩ bạn hiểu :) – Karolis

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