2010-03-16 33 views
5

Tôi muốn biết liệu tôi có thể phục hồi lại giá trị autoincrement trong mysql hay không.cách tái tạo lại/tự động tái tạo trong mysql

Bởi vì, tôi có hồ sơ mà trông giống như:

ID Name 
1 POP 
3 OLO 
12 lku 

Về cơ bản, tôi muốn có một cách để cập nhật ID này

ID Name 
1 POP 
2 OLO 
3 lku 

Có cách nào để làm điều này trong mysql?

Cảm ơn.

Trả lời

3

Thực hành tốt nhất là không nên viết các khóa chính của bạn - tốt hơn là để cho DB của bạn tự xử lý nó. Có thể có vấn đề nếu ở giữa UPDATEALTER, một bản ghi khác sẽ được thêm vào. Bởi vì điều này, bạn phải LOCK bảng, có thể treo các truy vấn khác và tải tăng đột biến trên máy chủ sản xuất bận.

LOCK TABLES table WRITE 
UPDATE table SET id=3 WHERE id=12; 
ALTER TABLE table AUTO_INCREMENT=4; 
UNLOCK TABLES 

HOẶC - cho hàng ngàn hàng (không phụ thuộc chủ yếu foriegn):

CREATE TEMPORARY TABLE nameTemp(name varchar(128) not null) 
INSERT INTO name SELECT name FROM firstTable 
TRUNCATE firstTable 
INSERT INTO firstTable SELECT name FROM nameTemp 

Phương pháp thứ hai sẽ chỉ làm việc mà bạn không có phím nước ngoài. Nếu bạn làm thế, bạn sẽ cần một bảng tra cứu.

CREATE TEMPORARY TABLE lookup(newId INTEGER AUTO_INCREMENT, oldId INTEGER, PRIMARY KEY newId(newId)); 
INSERT INTO lookup (oldId) SELECT id FROM firstTable 
[do temp table queries above] 

Bây giờ bạn có một bảng lookup với cái cũ để id mới mà bạn có thể sử dụng để cập nhật các phụ thuộc khoá ngoại trên bảng khác của bạn (trên máy chủ thử nghiệm!)

+0

KHÔNG, tôi có hàng nghìn bản ghi mà tôi muốn lặp lại, Dữ liệu này chỉ là mẫu. – JPro

+0

Đã cập nhật cho hàng nghìn bản ghi – Andy

0

Thay đổi khóa chính là một rất ý tưởng tồi vì nó gây nguy hiểm cho tính toàn vẹn tham chiếu của bạn (điều gì sẽ xảy ra nếu một bảng khác sử dụng id mà không có khoá ngoại với "thay đổi" thích hợp?).

Nếu bạn thực sự, thực sự phải làm điều đó và không quan tâm đến xấu tác dụng phụ:

  • Tạo một bảng thứ hai với cấu trúc giống hệt
  • INSERT INTO id new_table (, [các lĩnh vực khác]) SELECT NULL, [các trường khác] FROM old_table;
  • DROP old_table;
  • RENAME new_table old_table;

Cảnh báo:
Điều này sẽ làm hỏng mọi bảng khác có khóa lạ trên bảng này (nhưng nếu bạn có như vậy thì bạn sẽ không thực hiện việc này).

0

Bạn có thể muốn thử một cái gì đó giống như ...

Create Temporary table MyBackup 
( ID as your autoincrement, 
    OldID as Int for backlinking/retention, 
    RestOfFields as their type) 

insert into MyBackup 
( OldID 
    RestOfFields) 
select 
    ID as OldID, 
    RestOfFields 
    from 
    YourOriginalTable 
    order by 
    ID (this is your original ID) 

Sau đó, bạn sẽ có một bảng mới với một autoincrement với ID mới được giao, chưa có một bản sao đầy đủ của ID ban đầu của họ. Sau đó, bạn có thể cập nhật tương ứng với các bảng khác và đặt ID = ID trong đó ID = OldID. Bằng cách giữ chèn của bạn qua đơn đặt hàng bằng ID ban đầu, nó sẽ giữ cho các con số không bị thay thế ngoài chuỗi ..Ví dụ: nếu bảng của bạn được orderd như Cũ ID = 3, ID mới = 1 Cũ ID = 1, ID mới = 3 Cũ ID = 12, ID mới = 2

cũ 3 của bạn sẽ trở thành 1, sau đó của 1 sẽ trở thành 3, và 12 của trở thành 2 nhân

Cũ ID = 1, ID mới = 1 Cũ ID = 3, ID mới = 2 Cũ ID = 12, ID mới = 3

bạn won 3 của không ghi đè số cao hơn và số 12 sẽ không xung đột với số 3 vì số ba đã giảm xuống còn 2.

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