Tôi đồng ý với @Aaron Digulla và @Shane N. Khoảng trống là vô nghĩa. Nếu họ DO có nghĩa là một cái gì đó, đó là một thiết kế cơ sở dữ liệu thiếu sót. Giai đoạn.
Điều đó đang được nói, nếu bạn hoàn toàn CẦN phải lấp đầy các lỗ này, VÀ bạn đang chạy ít nhất MySQL 3.23, bạn có thể sử dụng TẠM TẠO để tạo bộ ID mới.Ý tưởng ở đây là bạn sẽ chọn tất cả các ID hiện tại của bạn, theo thứ tự, vào một bảng tạm thời như vậy:
CREATE TEMPORARY TABLE NewIDs
(
NewID INT UNSIGNED AUTO INCREMENT,
OldID INT UNSIGNED
)
INSERT INTO NewIDs (OldId)
SELECT
Id
FROM
OldTable
ORDER BY
Id ASC
này sẽ cung cấp cho bạn một bảng vẽ bản đồ Id cũ sang một thương hiệu Id mới đó là sẽ được tuần tự trong tự nhiên, do thuộc tính AUTO INCREMENT của cột NewId.
Khi việc này được thực hiện, bạn cần cập nhật bất kỳ tham chiếu nào khác đến Id trong "OldTable" và bất kỳ khóa ngoại nào mà nó sử dụng. Để thực hiện điều này, bạn có thể cần phải DROP bất kỳ ràng buộc khoá ngoại nào mà bạn có, cập nhật bất kỳ tham chiếu nào trong các bảng từ OldId sang NewId, và sau đó tái tạo các ràng buộc khóa ngoài của bạn.
Tuy nhiên, tôi sẽ cho rằng bạn không nên làm BẤT CỨ điều này, và chỉ cần hiểu rằng lĩnh vực Id của bạn tồn tại với mục đích duy nhất của tham khảo một kỷ lục, và nên KHÔNG có bất kỳ sự liên quan cụ thể.
UPDATE: Thêm một ví dụ về việc cập nhật các Id
Ví dụ:
Hãy nói rằng bạn có 2 schemas bảng sau:
CREATE TABLE Parent
(
ParentId INT UNSIGNED AUTO INCREMENT,
Value INT UNSIGNED,
PRIMARY KEY (ParentId)
)
CREATE TABLE Child
(
ChildId INT UNSIGNED AUTO INCREMENT,
ParentId INT UNSIGNED,
PRIMARY KEY(ChildId),
FOREIGN KEY(ParentId) REFERENCES Parent(ParentId)
)
Bây giờ, khoảng cách là xuất hiện trong bảng cha của bạn.
Để cập nhật giá trị của bạn trong mẹ và trẻ em, trước tiên bạn tạo một bảng tạm thời với các ánh xạ:
CREATE TEMPORARY TABLE NewIDs
(
Id INT UNSIGNED AUTO INCREMENT,
ParentID INT UNSIGNED
)
INSERT INTO NewIDs (ParentId)
SELECT
ParentId
FROM
Parent
ORDER BY
ParentId ASC
Tiếp theo, chúng ta cần phải nói với MySQL để bỏ qua các ràng buộc khoá ngoại vì vậy chúng tôi có thể đúng CẬP NHẬT giá trị của chúng tôi. Chúng tôi sẽ sử dụng cú pháp sau:
SET foreign_key_checks = 0;
Điều này làm cho MySQL để bỏ qua kiểm tra chính nước ngoài khi cập nhật các giá trị, nhưng nó vẫn sẽ thi hành các loại giá trị chính xác được sử dụng (xem MySQL reference để biết chi tiết).
Tiếp theo, chúng tôi cần cập nhật bảng Cha mẹ và con với các giá trị mới. Chúng tôi sẽ sử dụng tuyên bố UPDATE sau cho điều này:
UPDATE
Parent,
Child,
NewIds
SET
Parent.ParentId = NewIds.Id,
Child.ParentId = NewIds.Id
WHERE
Parent.ParentId = NewIds.ParentId AND
Child.ParentId = NewIds.ParentId
Hiện tại, chúng tôi đã cập nhật tất cả các giá trị ParentId chính xác cho các Id được đặt hàng mới từ bảng tạm thời của chúng tôi. Sau khi hoàn tất, chúng ta có thể tái lập nên kiểm tra chính nước ngoài của chúng tôi để duy trì tính toàn vẹn tham chiếu:
SET foreign_key_checks = 1;
Cuối cùng, chúng tôi sẽ thả bảng tạm thời của chúng tôi để làm sạch nguồn:
DROP TABLE NewIds
Và đó là .
Hãy xem điều này: 'shoes' có id 1,' shirts' có id 2, 'jackets' có id 3. Bạn quyết định xóa' shirts', sau đó bạn quyết định thêm 'pants'. Nếu bạn điền vào khoảng trống, sau đó trong một khoảng thời gian ngắn, các công cụ tìm kiếm sẽ dẫn những người đang tìm kiếm áo sơ mi đến 'example.com/product? Id = 2', đó là ...' pants'. –