Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mengisi lubang di bidang kenaikan otomatis?

Saya setuju dengan @Aaron Digulla dan @Shane N. Kesenjangan tidak ada artinya. Jika mereka MELAKUKAN berarti sesuatu, itu adalah desain database yang cacat. Titik.

Karena itu, jika Anda benar-benar PERLU mengisi lubang ini, DAN Anda menjalankan setidaknya MySQL 3.23, Anda dapat menggunakan TABEL SEMENTARA untuk membuat satu set ID baru. Idenya di sini adalah bahwa Anda akan memilih semua ID Anda saat ini, secara berurutan, ke dalam tabel sementara seperti:

CREATE TEMPORARY TABLE NewIDs
(
    NewID INT UNSIGNED AUTO INCREMENT,
    OldID INT UNSIGNED
)

INSERT INTO NewIDs (OldId)
SELECT
    Id
FROM
    OldTable
ORDER BY
    Id ASC

Ini akan memberi Anda tabel yang memetakan ID lama Anda ke ID baru yang akan bersifat berurutan, karena properti AUTO INCREMENT dari kolom NewId.

Setelah ini selesai, Anda perlu memperbarui referensi lain ke Id di "OldTable" dan kunci asing apa pun yang digunakannya. Untuk melakukannya, Anda mungkin perlu MENGHAPUS batasan kunci asing apa pun yang Anda miliki, memperbarui referensi apa pun dalam tabel dari OldId ke NewId, lalu memasang kembali batasan kunci asing Anda.

Namun, saya berpendapat bahwa Anda tidak boleh melakukan APAPUN ini, dan pahami saja bahwa bidang Id Anda ada hanya untuk tujuan referensi catatan, dan seharusnya TIDAK memiliki relevansi tertentu.

UPDATE:Menambahkan contoh memperbarui Id

Misalnya:

Katakanlah Anda memiliki 2 skema tabel berikut:

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)
)

Sekarang, celah muncul di tabel Induk Anda.

Untuk memperbarui nilai Anda di Induk dan Anak, Anda terlebih dahulu membuat tabel sementara dengan pemetaan:

CREATE TEMPORARY TABLE NewIDs
(
    Id INT UNSIGNED AUTO INCREMENT,
    ParentID INT UNSIGNED
)

INSERT INTO NewIDs (ParentId)
SELECT
    ParentId
FROM
    Parent
ORDER BY
    ParentId ASC

Selanjutnya, kita perlu memberi tahu MySQL untuk mengabaikan batasan kunci asing sehingga kita dapat MEMPERBARUI nilai kita dengan benar. Kami akan menggunakan sintaks ini:

SET foreign_key_checks = 0;

Hal ini menyebabkan MySQL mengabaikan pemeriksaan kunci asing saat memperbarui nilai, tetapi tetap akan menerapkan jenis nilai yang benar yang digunakan (lihat Referensi MySQL untuk rincian).

Selanjutnya, kita perlu memperbarui tabel Induk dan Anak dengan nilai baru. Kami akan menggunakan pernyataan UPDATE berikut untuk ini:

UPDATE
    Parent,
    Child,
    NewIds
SET
    Parent.ParentId = NewIds.Id,
    Child.ParentId = NewIds.Id
WHERE
    Parent.ParentId = NewIds.ParentId AND
    Child.ParentId = NewIds.ParentId

Kami sekarang telah memperbarui semua nilai ParentId kami dengan benar ke Id baru yang dipesan dari tabel sementara kami. Setelah ini selesai, kami dapat menerapkan kembali pemeriksaan kunci asing untuk menjaga integritas referensial:

SET foreign_key_checks = 1;

Terakhir, kami akan menghapus tabel sementara untuk membersihkan sumber daya:

DROP TABLE NewIds

Dan itu dia.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membuat dan Menggunakan Prosedur Tersimpan MySQL - Tutorial

  2. CURTIME() Contoh – MySQL

  3. Panduan Merancang Database Untuk Polling &Survey Di MySQL

  4. Kapan menggunakan STRAIGHT_JOIN dengan MySQL

  5. Bagaimana cara mengambil nama pengguna dan kata sandi MySQL saya?